济南百度做网站,怎么经营团购网站,网站主办单位负责人,无经验能做sem专员CSDN 课程推荐#xff1a;《迈向数据科学家#xff1a;带你玩转Python数据分析》#xff0c;讲师齐伟#xff0c;苏州研途教育科技有限公司CTO#xff0c;苏州大学应用统计专业硕士生指导委员会委员#xff1b;已出版《跟老齐学Python#xff1a;轻松入门》《跟老齐学Py…
CSDN 课程推荐《迈向数据科学家带你玩转Python数据分析》讲师齐伟苏州研途教育科技有限公司CTO苏州大学应用统计专业硕士生指导委员会委员已出版《跟老齐学Python轻松入门》《跟老齐学PythonDjango实战》、《跟老齐学Python数据分析》和《Python大学实用教程》畅销图书。Pandas 系列文章
Python 数据分析三剑客之 Pandas一认识 Pandas 及其 Series、DataFrame 对象Python 数据分析三剑客之 Pandas二Index 索引对象以及各种索引操作Python 数据分析三剑客之 Pandas三算术运算与缺失值的处理Python 数据分析三剑客之 Pandas四函数应用、映射、排序和层级索引Python 数据分析三剑客之 Pandas五统计计算与统计描述Python 数据分析三剑客之 Pandas六GroupBy 数据分裂、应用与合并Python 数据分析三剑客之 Pandas七合并数据集Python 数据分析三剑客之 Pandas八数据重塑、重复数据处理与数据替换Python 数据分析三剑客之 Pandas九时间序列Python 数据分析三剑客之 Pandas十数据读写 另有 NumPy、Matplotlib 系列文章已更新完毕欢迎关注
NumPy 系列文章https://itrhx.blog.csdn.net/category_9780393.htmlMatplotlib 系列文章https://itrhx.blog.csdn.net/category_9780418.html 推荐学习资料与网站博主参与部分文档翻译
NumPy 官方中文网https://www.numpy.org.cn/Pandas 官方中文网https://www.pypandas.cn/Matplotlib 官方中文网https://www.matplotlib.org.cn/NumPy、Matplotlib、Pandas 速查表https://github.com/TRHX/Python-quick-reference-table 文章目录【01x00】时间序列【02x00】Timestamp 时间戳【02x01】pandas.Timestamp【02x02】freq 频率部分取值【02x03】to_datetime【02x04】date_range【02x05】索引与切片【02x06】移动数据与数据偏移【02x07】时区处理【03x00】period 固定时期【03x01】pandas.Period【03x02】period_range【03x03】asfreq 时期频率转换【03x04】to_period 与 to_timestamp()【04x00】timedelta 时间间隔【04x01】pandas.Timedelta【04x02】to_timedelta【04x03】timedelta_range【05x00】重采样及频率转换这里是一段防爬虫文本请读者忽略。
本文原创首发于 CSDN作者 TRHX。
博客首页https://itrhx.blog.csdn.net/
本文链接https://itrhx.blog.csdn.net/article/details/106947061
未经授权禁止转载恶意转载后果自负尊重原创远离剽窃【01x00】时间序列
官网对于时间序列的介绍https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html
时间序列time series是一种重要的结构化数据形式应用于多个领域包括金融学、经济学、生态学、神经科学、物理学等。在多个时间点观察或测量到的任何事物都可以形成一段时间序列。很多时间序列是固定频率的也就是说数据点是根据某种规律定期出现的比如每15秒、每5分钟、每月出现一次。时间序列也可以是不定期的没有固定的时间单位或单位之间的偏移量。时间序列数据的意义取决于具体的应用场景主要有以下几种 时间戳timestamp表示某个具体的时间点例如 2020-6-24 15:30 固定周期period表示某个时间周期例如 2020-01 时间间隔timedelta持续时间即两个日期或时间之间的差异。 针对时间戳数据Pandas 提供了 Timestamp 类型。它本质上是 Python 的原生 datetime 类型的替代品但是在性能更好的 numpy.datetime64 类型的基础上创建。对应的索引数据结构是 DatetimeIndex。 针对时间周期数据Pandas 提供了 Period 类型。这是利用 numpy.datetime64 类型将固定频率的时间间隔进行编码。对应的索引数据结构是 PeriodIndex。 针对时间增量或持续时间Pandas 提供了 Timedelta 类型。Timedelta 是一种代替 Python 原生datetime.timedelta 类型的高性能数据结构同样是基于 numpy.timedelta64 类型。对应的索引数据结构是 TimedeltaIndex。
【02x00】Timestamp 时间戳
【02x01】pandas.Timestamp
在 pandas 中pandas.Timestamp 方法用来代替 Python 中的 datetime.datetime 方法。
Timestamp 与 Python 的 Datetime 等效在大多数情况下都可以互换。 此类型用于组成 DatetimeIndex 以及 Pandas 中其他面向时间序列的数据结构。
官方文档https://pandas.pydata.org/docs/reference/api/pandas.Timestamp.html
基本语法
class pandas.Timestamp(ts_inputobject object, freqNone, tzNone, unitNone, yearNone, monthNone, dayNone, hourNone, minuteNone, secondNone, microsecondNone, nanosecondNone, tzinfoNone)常用参数
参数描述ts_input要转换为时间戳的对象可以是 datetime-likestrintfloat 类型freq时间戳将具有的偏移量可以是 str日期偏移量类型取值参见【02x02】freq 频率部分取值tz时间戳将具有的时区unit如果 ts_input 是整数或浮点数该参数用于设置其单位D、s、ms、us、ns
简单示例 import pandas as pdpd.Timestamp(2017-01-01T12)
Timestamp(2017-01-01 12:00:00)设置 units即待转换对象单位为秒 import pandas as pdpd.Timestamp(1513393355.5, units)
Timestamp(2017-12-16 03:02:35.500000)使用 tz 参数设置时区 import pandas as pdpd.Timestamp(1513393355, units, tzUS/Pacific)
Timestamp(2017-12-15 19:02:35-0800, tzUS/Pacific)单独设置年月日 import pandas as pdpd.Timestamp(year2020, month6, day24, hour12)
Timestamp(2020-06-24 12:00:00)【02x02】freq 频率部分取值
完整取值参见官方文档https://pandas.pydata.org/docs/user_guide/timeseries.html#timeseries-offset-aliases
参数类型描述DDay每日历日BBusinessDay每工作日HHour每小时T 或 minMinute每分SSecond每秒L 或 msMilli每毫秒即每千分之一秒UMicro每微秒即每百万分之一秒MMonthEnd每月最后一个日历日BMBusinessMonthEnd每月最后一个工作日MSMonthBegin每月第一个日历日BMSBusinessMonthBegin每月第一个工作日W-MON、W-TUE…Week从指定的星期几MON、TUE、 WED、THU、FR、SAT、SUN开始算起每周WoM-1MON、WOM-2MON…WeekOfMonth产生每月第一、第二、第三或第四周的星期几。例如WoM-3FRI 表示每月第3个星期五Q-JAN、Q-FEB…QuarterEnd对于以指定月份JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV、DEC结束的年度每季度最后一月的最后个日历日BQ-JAN、BQ-FEB…BusinessQuarterEnd对于以指定月份结束的年度每季度最后一月的最后一个工作日QS-JAN、QS-FEB…QuarterBegin对于以指定月份结束的年度每季度最后一月的第一个日历日BQS-JAN、 BQS-FEB…BusinessQuarterBegin对于以指定月份结束的年度每季度最后一月的第一个工作日A-JAN、A-FEB…YearEnd每年指定月份JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、 OCT、NOV、DEC的最后一个日历日BA-JAN、BA-FEB…BusinessYearEnd每年指定月份的最后一个工作日AS-JAN、AS-FEB…YearBegin每年指定月份的第一个历日日BAS-JAN、BAS-FEB…BusinessYearBegin每年指定月份的第一个工作日
【02x03】to_datetime
在 Python 中datetime 库提供了日期和时间处理方法利用 str 或 strftime 方法可以将 datetime 对象转化成字符串具体用法可参见【Python 标准库学习】日期和时间处理库 — datetime。 from datetime import datetimestamp datetime(2020, 6, 24)stamp
datetime.datetime(2020, 6, 24, 0, 0)str(stamp)
2020-06-24 00:00:00stamp.strftime(%Y-%m-%d)
2020-06-24在 pandas 中 to_datetime 方法可以将字符串解析成多种不同的 Timestamp时间戳 对象 import pandas as pddatestrs 2011-07-06 12:00:00type(datestrs)
class strpd.to_datetime(datestrs)
Timestamp(2011-07-06 12:00:00)基本语法
pandas.to_datetime(arg, errorsraise, dayfirstFalse, yearfirstFalse, utcNone, formatNone, exactTrue, unitNone, infer_datetime_formatFalse, originunix, cacheTrue)官方文档https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html
常用参数
参数描述arg要转换为日期时间的对象可以接受 int, float, str, datetime, list, tuple, 1-d array, Series DataFrame/dict-like 类型errors如果字符串不满足时间戳的形式是否会发生异常ignore不引发异常返回原始输入raise无效解析将引发异常默认coerce无效解析将被设置为NaTdayfirstbool 类型默认 False如果 arg 是 str 或列表是否首先解析为日期例如 dayfirst 为 True10/11/12 被解析为 2012-11-10为 False 则解析为 2012-10-11yearfirstbool 类型默认 False如果 arg 是 str 或列表是否首先解析为年份例如 dayfirst 为 True10/11/12 被解析为 2010-11-12为 False 则解析为 2012-10-11如果 dayfirst 和 yearfirst 都为 True则优先 yearfirstutcbool 类型是否转换为协调世界时默认 Noneformat格式化时间如 21/2/20 16:10 使用 %d/%m/%y %H:%M 会被解析为 2020-02-21 16:10:00符号含义常见文章【Python 标准库学习】日期和时间处理库 — datetime 或者官方文档exact如果为 True则需要精确的格式匹配。如果为 False则允许格式与目标字符串中的任何位置匹配unit如果 arg 是整数或浮点数该参数用于设置其单位D、s、ms、us、ns
简单应用 import pandas as pdobj pd.DataFrame({year: [2015, 2016], month: [2, 3], day: [4, 5]})objyear month day
0 2015 2 4
1 2016 3 5pd.to_datetime(obj)
0 2015-02-04
1 2016-03-05
dtype: datetime64[ns]设置 format 和 errors 参数 import pandas as pdpd.to_datetime(13000101, format%Y%m%d, errorsignore)
datetime.datetime(1300, 1, 1, 0, 0)pd.to_datetime(13000101, format%Y%m%d, errorscoerce)
NaTpd.to_datetime(13000101, format%Y%m%d, errorsraise)
Traceback (most recent call last):
...
pandas._libs.tslibs.np_datetime.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1300-01-01 00:00:00设置 unit 参数 import pandas as pdpd.to_datetime(1490195805, units)
Timestamp(2017-03-22 15:16:45)pd.to_datetime(1490195805433502912, unitns)
Timestamp(2017-03-22 15:16:45.433502912)【02x04】date_range
pandas.date_range 方法可用于根据指定的频率生成指定长度的 DatetimeIndex。
基本语法
pandas.date_range(startNone, endNone, periodsNone, freqNone, tzNone, normalizeFalse, nameNone, closedNone, **kwargs) → pandas.core.indexes.datetimes.DatetimeIndex官方文档https://pandas.pydata.org/docs/reference/api/pandas.date_range.html
参数描述start开始日期end结束日期periodsint 类型要生成的时段数天freq频率字符串即按照某种特定的频率来生成日期取值参见【02x02】freq 频率部分取值tz设置时区例如 “Asia/Hong_Kong”normalizebool 类型默认 False是否在生成日期之前对其进行规范化仅保留年月日name结果 DatetimeIndex 的名称closedNone默认值同时保留开始日期和结束日期left保留开始日期不保留结束日期right保留结束日期不保留开始日期
简单示例 import pandas as pdpd.date_range(start1/1/2018, end1/08/2018)
DatetimeIndex([2018-01-01, 2018-01-02, 2018-01-03, 2018-01-04,2018-01-05, 2018-01-06, 2018-01-07, 2018-01-08],dtypedatetime64[ns], freqD)指定 periods 参数 import pandas as pdpd.date_range(start2012-04-01, periods20)
DatetimeIndex([2012-04-01, 2012-04-02, 2012-04-03, 2012-04-04,2012-04-05, 2012-04-06, 2012-04-07, 2012-04-08,2012-04-09, 2012-04-10, 2012-04-11, 2012-04-12,2012-04-13, 2012-04-14, 2012-04-15, 2012-04-16,2012-04-17, 2012-04-18, 2012-04-19, 2012-04-20],dtypedatetime64[ns], freqD)pd.date_range(end2012-06-01, periods20)
DatetimeIndex([2012-05-13, 2012-05-14, 2012-05-15, 2012-05-16,2012-05-17, 2012-05-18, 2012-05-19, 2012-05-20,2012-05-21, 2012-05-22, 2012-05-23, 2012-05-24,2012-05-25, 2012-05-26, 2012-05-27, 2012-05-28,2012-05-29, 2012-05-30, 2012-05-31, 2012-06-01],dtypedatetime64[ns], freqD)pd.date_range(start2018-04-24, end2018-04-27, periods3)
DatetimeIndex([2018-04-24 00:00:00, 2018-04-25 12:00:00, 2018-04-27 00:00:00],dtypedatetime64[ns], freqNone)pd.date_range(start2018-04-24, end2018-04-28, periods3)
DatetimeIndex([2018-04-24, 2018-04-26, 2018-04-28], dtypedatetime64[ns], freqNone)指定 freqM 会按照每月最后一个日历日的频率生成日期指定 freq3M 会每隔3个月按照每月最后一个日历日的频率生成日期 import pandas as pdpd.date_range(start1/1/2018, periods5, freqM)
DatetimeIndex([2018-01-31, 2018-02-28, 2018-03-31, 2018-04-30,2018-05-31],dtypedatetime64[ns], freqM)pd.date_range(start1/1/2018, periods5, freq3M)
DatetimeIndex([2018-01-31, 2018-04-30, 2018-07-31, 2018-10-31,2019-01-31],dtypedatetime64[ns], freq3M)使用 tz 参数设置时区 import pandas as pdpd.date_range(start1/1/2018, periods5, tzAsia/Tokyo)
DatetimeIndex([2018-01-01 00:00:0009:00, 2018-01-02 00:00:0009:00,2018-01-03 00:00:0009:00, 2018-01-04 00:00:0009:00,2018-01-05 00:00:0009:00],dtypedatetime64[ns, Asia/Tokyo], freqD)pd.date_range(start6/24/2020, periods5, tzAsia/Hong_Kong)
DatetimeIndex([2020-06-24 00:00:0008:00, 2020-06-25 00:00:0008:00,2020-06-26 00:00:0008:00, 2020-06-27 00:00:0008:00,2020-06-28 00:00:0008:00],dtypedatetime64[ns, Asia/Hong_Kong], freqD)设置 normalize 参数在生成时间戳之前对其进行格式化操作 import pandas as pdpd.date_range(2020-06-24 12:56:31, periods5, normalizeTrue)
DatetimeIndex([2020-06-24, 2020-06-25, 2020-06-26, 2020-06-27,2020-06-28],dtypedatetime64[ns], freqD)设置 closed 参数 import pandas as pdpd.date_range(start2020-06-20, end2020-06-24, closedNone)
DatetimeIndex([2020-06-20, 2020-06-21, 2020-06-22, 2020-06-23,2020-06-24],dtypedatetime64[ns], freqD)pd.date_range(start2020-06-20, end2020-06-24, closedleft)
DatetimeIndex([2020-06-20, 2020-06-21, 2020-06-22, 2020-06-23], dtypedatetime64[ns], freqD)pd.date_range(start2020-06-20, end2020-06-24, closedright)
DatetimeIndex([2020-06-21, 2020-06-22, 2020-06-23, 2020-06-24], dtypedatetime64[ns], freqD)【02x05】索引与切片
Pandas 最基本的时间序列类型就是以时间戳通常以 Python 字符串或 datatime 对象表示为索引的Series这些 datetime 对象实际上是被放在 DatetimeIndex 中的可以使用类似 pandas.Series 对象的切片方法对其进行索引 import pandas as pdimport numpy as npdates [datetime(2011, 1, 2), datetime(2011, 1, 5),datetime(2011, 1, 7), datetime(2011, 1, 8),datetime(2011, 1, 10), datetime(2011, 1, 12)]obj pd.Series(np.random.randn(6), indexdates)obj
2011-01-02 -0.407110
2011-01-05 -0.186661
2011-01-07 -0.731080
2011-01-08 0.860970
2011-01-10 1.929973
2011-01-12 -0.168599
dtype: float64obj.index
DatetimeIndex([2011-01-02, 2011-01-05, 2011-01-07, 2011-01-08,2011-01-10, 2011-01-12],dtypedatetime64[ns], freqNone)obj.index[0]
Timestamp(2011-01-02 00:00:00)obj.index[0:3]
DatetimeIndex([2011-01-02, 2011-01-05, 2011-01-07], dtypedatetime64[ns], freqNone)另外还可以传入一个可以被解释为日期的字符串或者只需传入“年”或“年月”即可轻松选取数据的切片 import pandas as pdimport numpy as npobj pd.Series(np.random.randn(1000), indexpd.date_range(1/1/2000, periods1000))obj
2000-01-01 -1.142284
2000-01-02 1.198785
2000-01-03 2.466909
2000-01-04 -0.086728
2000-01-05 -0.978437...
2002-09-22 -0.252240
2002-09-23 0.148561
2002-09-24 -1.330409
2002-09-25 -0.673471
2002-09-26 -0.253271
Freq: D, Length: 1000, dtype: float64obj[26/9/2002]
-0.25327100684233356obj[2002]
2002-01-01 1.058715
2002-01-02 0.900859
2002-01-03 1.993508
2002-01-04 -0.103211
2002-01-05 -0.950090...
2002-09-22 -0.252240
2002-09-23 0.148561
2002-09-24 -1.330409
2002-09-25 -0.673471
2002-09-26 -0.253271
Freq: D, Length: 269, dtype: float64obj[2002-09]
2002-09-01 -0.995528
2002-09-02 0.501528
2002-09-03 -0.486753
2002-09-04 -1.083906
2002-09-05 1.458975
2002-09-06 -1.331685
2002-09-07 0.195338
2002-09-08 -0.429613
2002-09-09 1.125823
2002-09-10 1.607051
2002-09-11 0.530387
2002-09-12 -0.015938
2002-09-13 1.781043
2002-09-14 -0.277123
2002-09-15 0.344569
2002-09-16 -1.010810
2002-09-17 0.463001
2002-09-18 1.883636
2002-09-19 0.274520
2002-09-20 0.624184
2002-09-21 -1.203057
2002-09-22 -0.252240
2002-09-23 0.148561
2002-09-24 -1.330409
2002-09-25 -0.673471
2002-09-26 -0.253271
Freq: D, dtype: float64obj[20/9/2002:26/9/2002]
2002-09-20 0.624184
2002-09-21 -1.203057
2002-09-22 -0.252240
2002-09-23 0.148561
2002-09-24 -1.330409
2002-09-25 -0.673471
2002-09-26 -0.253271
Freq: D, dtype: float64【02x06】移动数据与数据偏移
移动shifting指的是沿着时间轴将数据前移或后移。Series 和 DataFrame 都有一个 shift 方法用于执行单纯的前移或后移操作保持索引不变 import pandas as pdimport numpy as npobj pd.Series(np.random.randn(4),indexpd.date_range(1/1/2000, periods4, freqM))obj
2000-01-31 -0.100217
2000-02-29 1.177834
2000-03-31 -0.644353
2000-04-30 -1.954679
Freq: M, dtype: float64obj.shift(2)
2000-01-31 NaN
2000-02-29 NaN
2000-03-31 -0.100217
2000-04-30 1.177834
Freq: M, dtype: float64obj.shift(-2)
2000-01-31 -0.644353
2000-02-29 -1.954679
2000-03-31 NaN
2000-04-30 NaN
Freq: M, dtype: float64因为简单的移位操作不会修改索引所以部分数据会被丢弃并引入 NaN缺失值。因此如果频率已知则可以将其传给 shift 以便实现对时间戳进行位移而不是对数据进行简单位移 import pandas as pdimport numpy as npobj pd.Series(np.random.randn(4),indexpd.date_range(1/1/2000, periods4, freqM))obj
2000-01-31 -0.100217
2000-02-29 1.177834
2000-03-31 -0.644353
2000-04-30 -1.954679
Freq: M, dtype: float64obj.shift(2, freqM)
2000-03-31 -0.100217
2000-04-30 1.177834
2000-05-31 -0.644353
2000-06-30 -1.954679
Freq: M, dtype: float64Pandas 中的频率是由一个基础频率base frequency和一个乘数组成的。基础频率通常以一个字符串别名表示比如 M 表示每月H 表示每小时。对于每个基础频率都有一个被称为日期偏移量date offset的对象与之对应。例如按小时计算的频率可以用 Hour 类表示 from pandas.tseries.offsets import Hour, Minutehour Hour()hour
Hourfour_hours Hour(4)four_hours
4 * Hours一般来说无需明确创建这样的对象只需使用诸如 H 或 4H 这样的字符串别名即可。在基础频率前面放上一个整数即可创建倍数 import pandas as pdpd.date_range(2000-01-01, 2000-01-03 23:59, freq4h)
DatetimeIndex([2000-01-01 00:00:00, 2000-01-01 04:00:00,2000-01-01 08:00:00, 2000-01-01 12:00:00,2000-01-01 16:00:00, 2000-01-01 20:00:00,2000-01-02 00:00:00, 2000-01-02 04:00:00,2000-01-02 08:00:00, 2000-01-02 12:00:00,2000-01-02 16:00:00, 2000-01-02 20:00:00,2000-01-03 00:00:00, 2000-01-03 04:00:00,2000-01-03 08:00:00, 2000-01-03 12:00:00,2000-01-03 16:00:00, 2000-01-03 20:00:00],dtypedatetime64[ns], freq4H)大部分偏移量对象都可通过加法进行连接 from pandas.tseries.offsets import Hour, MinuteHour(2) Minute(30)
150 * Minutes对于 freq 参数也可以传入频率字符串如 2h30min这种字符串可以被高效地解析为等效的表达式 import pandas as pdpd.date_range(2000-01-01, periods10, freq1h30min)
DatetimeIndex([2000-01-01 00:00:00, 2000-01-01 01:30:00,2000-01-01 03:00:00, 2000-01-01 04:30:00,2000-01-01 06:00:00, 2000-01-01 07:30:00,2000-01-01 09:00:00, 2000-01-01 10:30:00,2000-01-01 12:00:00, 2000-01-01 13:30:00],dtypedatetime64[ns], freq90T)这种偏移量还可以用在 datetime 或 Timestamp 对象上 from pandas.tseries.offsets import Day, MonthEndnow datetime(2011, 11, 17)now 3 * Day()
Timestamp(2011-11-20 00:00:00)如果加的是锚点偏移量比如 MonthEnd第一次增量会将原日期向前滚动到符合频率规则的下一个日期 from pandas.tseries.offsets import Day, MonthEndnow datetime(2011, 11, 17)now MonthEnd()
Timestamp(2011-11-30 00:00:00)now MonthEnd(2)
Timestamp(2011-12-31 00:00:00)通过锚点偏移量的 rollforward 和 rollback 方法可明确地将日期向前或向后滚动 from pandas.tseries.offsets import Day, MonthEndnow datetime(2011, 11, 17)offset MonthEnd()offset.rollforward(now)
Timestamp(2011-11-30 00:00:00)offset.rollback(now)
Timestamp(2011-10-31 00:00:00)与 groupby 方法结合使用 import pandas as pdimport numpy as npfrom pandas.tseries.offsets import Day, MonthEndobj pd.Series(np.random.randn(20),indexpd.date_range(1/15/2000, periods20, freq4d))obj
2000-01-15 -0.591729
2000-01-19 -0.775844
2000-01-23 -0.745603
2000-01-27 -0.076439
2000-01-31 1.796417
2000-02-04 -0.500349
2000-02-08 0.515851
2000-02-12 -0.344171
2000-02-16 0.419657
2000-02-20 0.307288
2000-02-24 0.115113
2000-02-28 -0.362585
2000-03-03 1.074892
2000-03-07 1.111366
2000-03-11 0.949910
2000-03-15 -1.535727
2000-03-19 0.545944
2000-03-23 -0.810139
2000-03-27 -1.260627
2000-03-31 -0.128403
Freq: 4D, dtype: float64offset MonthEnd()obj.groupby(offset.rollforward).mean()
2000-01-31 -0.078640
2000-02-29 0.021543
2000-03-31 -0.006598
dtype: float64【02x07】时区处理
在 Python 中时区信息来自第三方库 pytz使用 pytz.common_timezones 方法可以查看所有的时区名称使用 pytz.timezone 方法从 pytz 中获取时区对象 import pytzpytz.common_timezones
[Africa/Abidjan, Africa/Accra, Africa/Addis_Ababa, ..., UTC]tz pytz.timezone(Asia/Shanghai)tz
DstTzInfo Asia/Shanghai LMT8:06:00 STD # 表示与 UTC 时间相差8小时6分在 date_range 方法中tz 参数用于指定时区默认为 None可以使用 tz_localize 方法将其进行本地化时区转换如下示例中将无时区转本地化 UTC 时区 import pandas as pdimport numpy as nprng pd.date_range(3/9/2012 9:30, periods6, freqD)ts pd.Series(np.random.randn(len(rng)), indexrng)ts
2012-03-09 09:30:00 -1.527913
2012-03-10 09:30:00 -1.116101
2012-03-11 09:30:00 0.359358
2012-03-12 09:30:00 -0.475920
2012-03-13 09:30:00 -0.336570
2012-03-14 09:30:00 -1.075952
Freq: D, dtype: float64print(ts.index.tz)
Nonets_utc ts.tz_localize(UTC)ts_utc
2012-03-09 09:30:0000:00 -1.527913
2012-03-10 09:30:0000:00 -1.116101
2012-03-11 09:30:0000:00 0.359358
2012-03-12 09:30:0000:00 -0.475920
2012-03-13 09:30:0000:00 -0.336570
2012-03-14 09:30:0000:00 -1.075952
Freq: D, dtype: float64ts_utc.index
DatetimeIndex([2012-03-09 09:30:0000:00, 2012-03-10 09:30:0000:00,2012-03-11 09:30:0000:00, 2012-03-12 09:30:0000:00,2012-03-13 09:30:0000:00, 2012-03-14 09:30:0000:00],dtypedatetime64[ns, UTC], freqD)时间序列被本地化到某个特定时区后就可以用 tz_convert 方法将其转换到别的时区了 import pandas as pdimport numpy as nprng pd.date_range(3/9/2012 9:30, periods6, freqD)ts pd.Series(np.random.randn(len(rng)), indexrng)ts
2012-03-09 09:30:00 0.480303
2012-03-10 09:30:00 -1.461039
2012-03-11 09:30:00 -1.512749
2012-03-12 09:30:00 -2.185421
2012-03-13 09:30:00 1.657845
2012-03-14 09:30:00 0.175633
Freq: D, dtype: float64ts.tz_localize(UTC).tz_convert(Asia/Shanghai)
2012-03-09 17:30:0008:00 0.480303
2012-03-10 17:30:0008:00 -1.461039
2012-03-11 17:30:0008:00 -1.512749
2012-03-12 17:30:0008:00 -2.185421
2012-03-13 17:30:0008:00 1.657845
2012-03-14 17:30:0008:00 0.175633
Freq: D, dtype: float64这里是一段防爬虫文本请读者忽略。
本文原创首发于 CSDN作者 TRHX。
博客首页https://itrhx.blog.csdn.net/
本文链接https://itrhx.blog.csdn.net/article/details/106947061
未经授权禁止转载恶意转载后果自负尊重原创远离剽窃【03x00】period 固定时期
【03x01】pandas.Period
固定时期period表示的是时间区间比如数日、数月、数季、数年等。Period 类所表示的就是这种数据类型其构造函数需要用到一个字符串或整数。
基本语法
class pandas.Period(valueNone, freqNone, ordinalNone, yearNone, monthNone, quarterNone, dayNone, hourNone, minuteNone, secondNone)官方文档https://pandas.pydata.org/docs/reference/api/pandas.Period.html
常用参数
参数描述value时间段freq时间戳将具有的偏移量可以是 str日期偏移量类型取值参见【02x02】freq 频率部分取值
以下示例中Period 对象表示的是从2020年1月1日到2020年12月31日之间的整段时间 import pandas as pdpd.Period(2020, freqA-DEC)
Period(2020, A-DEC)利用加减法对其按照频率进行位移 import pandas as pdobj pd.Period(2020, freqA-DEC)obj
Period(2020, A-DEC)obj 5
Period(2025, A-DEC)obj - 5
Period(2015, A-DEC)PeriodIndex 类保存了一组 Period它可以在任何 pandas 数据结构中被用作轴索引 import pandas as pdimport numpy as nprng [pd.Period(2000-01), pd.Period(2000-02), pd.Period(2000-03), pd.Period(2000-04), pd.Period(2000-05), pd.Period(2000-06)]obj pd.Series(np.random.randn(6), indexrng)obj
2000-01 0.229092
2000-02 1.515498
2000-03 -0.334401
2000-04 -0.492681
2000-05 -2.012818
2000-06 0.338804
Freq: M, dtype: float64obj.index
PeriodIndex([2000-01, 2000-02, 2000-03, 2000-04, 2000-05, 2000-06], dtypeperiod[M], freqM)import pandas as pdvalues [2001Q3, 2002Q2, 2003Q1]index pd.PeriodIndex(values, freqQ-DEC)index
PeriodIndex([2001Q3, 2002Q2, 2003Q1], dtypeperiod[Q-DEC], freqQ-DEC)【03x02】period_range
pandas.period_range 方法可根据指定的频率生成指定长度的 PeriodIndex。
基本语法
pandas.period_range(startNone, endNone, periodsNone, freqNone, nameNone) → pandas.core.indexes.period.PeriodIndex
官方文档https://pandas.pydata.org/docs/reference/api/pandas.period_range.html
常用参数
参数描述start起始日期end结束日期periods要生成的时段数freq时间戳将具有的偏移量可以是 str日期偏移量类型取值参见【02x02】freq 频率部分取值name结果 PeriodIndex 对象名称
简单应用 import pandas as pdpd.period_range(start2019-01-01, end2020-01-01, freqM)
PeriodIndex([2019-01, 2019-02, 2019-03, 2019-04, 2019-05, 2019-06,2019-07, 2019-08, 2019-09, 2019-10, 2019-11, 2019-12,2020-01],dtypeperiod[M], freqM)pd.period_range(startpd.Period(2017Q1, freqQ),endpd.Period(2017Q2, freqQ), freqM)
PeriodIndex([2017-03, 2017-04, 2017-05, 2017-06], dtypeperiod[M], freqM)【03x03】asfreq 时期频率转换
Period 和 PeriodIndex 对象都可以通过 asfreq 方法被转换成别的频率。
基本语法PeriodIndex.asfreq(self, *args, **kwargs)
常用参数
参数描述freq新的频率偏移量取值参见【02x02】freq 频率部分取值how按照开始或者结束对齐E or END or FINISHS or START or BEGIN
应用示例 import pandas as pdpidx pd.period_range(2010-01-01, 2015-01-01, freqA)pidx
PeriodIndex([2010, 2011, 2012, 2013, 2014, 2015], dtypeperiod[A-DEC], freqA-DEC)pidx.asfreq(M)
PeriodIndex([2010-12, 2011-12, 2012-12, 2013-12, 2014-12, 2015-12], dtypeperiod[M], freqM)pidx.asfreq(M, howS)
PeriodIndex([2010-01, 2011-01, 2012-01, 2013-01, 2014-01, 2015-01], dtypeperiod[M], freqM)【03x04】to_period 与 to_timestamp()
to_period 方法可以将 Timestamp时间戳 转换为 Period固定时期
to_timestamp 方法可以将 Period固定时期转换为 Timestamp时间戳 。 import pandas as pdrng pd.date_range(2000-01-01, periods3, freqM)ts pd.Series(np.random.randn(3), indexrng)ts
2000-01-31 0.220759
2000-02-29 -0.108221
2000-03-31 0.819433
Freq: M, dtype: float64pts ts.to_period()pts
2000-01 0.220759
2000-02 -0.108221
2000-03 0.819433
Freq: M, dtype: float64pts2 pts.to_timestamp()pts2
2000-01-01 0.220759
2000-02-01 -0.108221
2000-03-01 0.819433
Freq: MS, dtype: float64ts.index
DatetimeIndex([2000-01-31, 2000-02-29, 2000-03-31], dtypedatetime64[ns], freqM)pts.index
PeriodIndex([2000-01, 2000-02, 2000-03], dtypeperiod[M], freqM)pts2.index
DatetimeIndex([2000-01-01, 2000-02-01, 2000-03-01], dtypedatetime64[ns], freqMS)【04x00】timedelta 时间间隔
【04x01】pandas.Timedelta
Timedelta 表示持续时间即两个日期或时间之间的差。
Timedelta 相当于 Python 的 datetime.timedelta在大多数情况下两者可以互换。
基本语法class pandas.Timedelta(valueobject object, unitNone, **kwargs)
官方文档https://pandas.pydata.org/docs/reference/api/pandas.Timedelta.html
常用参数
参数描述value传入的值可以是 Timedeltatimedeltanp.timedelta64string 或 integer 对象unit用于设置 value 的单位具体取值参见官方文档
表示两个 datetime 对象之间的时间差 import pandas as pdpd.to_datetime(2020-6-24) - pd.to_datetime(2016-1-1)
Timedelta(1636 days 00:00:00)通过字符串传递参数 import pandas as pdpd.Timedelta(3 days 3 hours 3 minutes 30 seconds)
Timedelta(3 days 03:03:30)通过整数传递参数 import pandas as pdpd.Timedelta(5,unith)
Timedelta(0 days 05:00:00)获取属性 import pandas as pdobj pd.Timedelta(3 days 3 hours 3 minutes 30 seconds)obj
Timedelta(3 days 03:03:30)obj.days
3obj.seconds
11010【04x02】to_timedelta
to_timedelta 方法可以将传入的对象转换成 timedelta 对象。
基本语法pandas.to_timedelta(arg, unitns, errorsraise)
官方文档https://pandas.pydata.org/docs/reference/api/pandas.to_timedelta.html
常用参数
参数描述arg要转换为 timedelta 的对象可以是 strtimedeltalist-like 或 Series 对象unit用于设置 arg 的单位具体取值参见官方文档errors如果 arg 不满足时间戳的形式是否会发生异常ignore不引发异常返回原始输入raise无效解析将引发异常默认coerce无效解析将被设置为NaT
将单个字符串解析为 timedelta 对象 import pandas as pdpd.to_timedelta(1 days 06:05:01.00003)
Timedelta(1 days 06:05:01.000030)pd.to_timedelta(15.5us)
Timedelta(0 days 00:00:00.000015)将字符串列表或数组解析为 timedelta 对象 import pandas as pdpd.to_timedelta([1 days 06:05:01.00003, 15.5us, nan])
TimedeltaIndex([1 days 06:05:01.000030, 0 days 00:00:00.000015, NaT], dtypetimedelta64[ns], freqNone)指定 unit 参数 import pandas as pdpd.to_timedelta(np.arange(5), units)
TimedeltaIndex([00:00:00, 00:00:01, 00:00:02, 00:00:03, 00:00:04], dtypetimedelta64[ns], freqNone)pd.to_timedelta(np.arange(5), unitd)
TimedeltaIndex([0 days, 1 days, 2 days, 3 days, 4 days], dtypetimedelta64[ns], freqNone)【04x03】timedelta_range
timedelta_range 方法可根据指定的频率生成指定长度的 TimedeltaIndex。
基本语法
pandas.timedelta_range(startNone, endNone, periodsNone,freqNone, nameNone, closedNone) → pandas.core.indexes.timedeltas.TimedeltaIndex官方文档https://pandas.pydata.org/docs/reference/api/pandas.timedelta_range.html
常用参数
参数描述start开始日期end结束日期periodsint 类型要生成的时段数freq频率字符串即按照某种特定的频率来生成日期取值参见【02x02】freq 频率部分取值name结果 TimedeltaIndex 的名称closedNone默认值同时保留开始日期和结束日期left保留开始日期不保留结束日期right保留结束日期不保留开始日期
应用示例 import pandas as pdpd.timedelta_range(start1 day, periods4)
TimedeltaIndex([1 days, 2 days, 3 days, 4 days], dtypetimedelta64[ns], freqD)closed 参数指定保留哪个端点。默认保留两个端点 import pandas as pdpd.timedelta_range(start1 day, periods4, closedright)
TimedeltaIndex([2 days, 3 days, 4 days], dtypetimedelta64[ns], freqD)freq 参数指定 TimedeltaIndex 的频率。只接受固定频率非固定频率如 M 将会报错 import pandas as pdpd.timedelta_range(start1 day, end2 days, freq6H)
TimedeltaIndex([1 days 00:00:00, 1 days 06:00:00, 1 days 12:00:00,1 days 18:00:00, 2 days 00:00:00],dtypetimedelta64[ns], freq6H)pd.timedelta_range(start1 day, end2 days, freqM)
Traceback (most recent call last):
...
ValueError: MonthEnd is a non-fixed frequency【05x00】重采样及频率转换
重采样resampling指的是将时间序列从一个频率转换到另一个频率的处理过程。将高频率数据聚合到低频率称为降采样downsampling而将低频率数据转换到高频率则称为升采样upsampling。并不是所有的重采样都能被划分到这两个大类中。例如将 W-WED每周三转换为 W-FRI 既不是降采样也不是升采样。
Pandas 中提供了 resample 方法来帮助我们实现重采样。Pandas 对象都带有一个 resample 方法它是各种频率转换工作的主力函数。
基本语法
Series.resample(self, rule, axis0, closed: Union[str, NoneType] None, label: Union[str, NoneType] None, convention: str start, kind: Union[str, NoneType] None, loffsetNone, base: int 0, onNone, levelNone)DataFrame.resample(self, rule, axis0, closed: Union[str, NoneType] None, label: Union[str, NoneType] None, convention: str start, kind: Union[str, NoneType] None, loffsetNone, base: int 0, onNone, levelNone)常用参数
参数描述ruleaxis重采样的轴默认 0closed在重采样中各时间段的哪一端是闭合即包含的除 M、A、Q、BM、BA、BQ 和 W 默认值为 ‘right’ 外其他默认值为 left‘label在重采样中如何设置聚合值的标签 right 或 left默认为 None例如9:30 到 9:35 之间的这 5 分钟会被标记为 9:30 或 9:35convention仅用于 PeriodIndex固定时期对周期进行重采样start or send or eon对于 DataFrame 对象可用该参数指定重采样后的数据的 index行索引 为原数据中的某列level对于具有层级索引MultiIndex的 DataFrame 对象可以使用该参数来指定需要在哪个级别上进行重新采样
将序列重采样到三分钟的频率并将每个频率的值相加 import pandas as pdindex pd.date_range(1/1/2000, periods9, freqT)series pd.Series(range(9), indexindex)series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64series.resample(3T).sum()
2000-01-01 00:00:00 3
2000-01-01 00:03:00 12
2000-01-01 00:06:00 21
Freq: 3T, dtype: int64设置 labelright即每个索引 index 会使用靠右侧较大值的标签 import pandas as pdindex pd.date_range(1/1/2000, periods9, freqT)series pd.Series(range(9), indexindex)series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64series.resample(3T, labelright).sum()
2000-01-01 00:03:00 3
2000-01-01 00:06:00 12
2000-01-01 00:09:00 21
Freq: 3T, dtype: int64设置 closedright即结果中会包含原数据中最右侧较大的值 import pandas as pdindex pd.date_range(1/1/2000, periods9, freqT)series pd.Series(range(9), indexindex)series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64series.resample(3T, labelright, closedright).sum()
2000-01-01 00:00:00 0
2000-01-01 00:03:00 6
2000-01-01 00:06:00 15
2000-01-01 00:09:00 15
Freq: 3T, dtype: int64以下示例将序列重采样到30秒的频率asfreq()[0:5] 用于选择前5行数据 import pandas as pdindex pd.date_range(1/1/2000, periods9, freqT)series pd.Series(range(9), indexindex)series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64series.resample(30S).asfreq()[0:5]
2000-01-01 00:00:00 0.0
2000-01-01 00:00:30 NaN
2000-01-01 00:01:00 1.0
2000-01-01 00:01:30 NaN
2000-01-01 00:02:00 2.0
Freq: 30S, dtype: float64使用 pad 方法向后填充缺失值NaN import pandas as pdindex pd.date_range(1/1/2000, periods9, freqT)series pd.Series(range(9), indexindex)series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64series.resample(30S).pad()[0:5]
2000-01-01 00:00:00 0
2000-01-01 00:00:30 0
2000-01-01 00:01:00 1
2000-01-01 00:01:30 1
2000-01-01 00:02:00 2
Freq: 30S, dtype: int64使用 bfill 方法向前填充缺失值NaN import pandas as pdindex pd.date_range(1/1/2000, periods9, freqT)series pd.Series(range(9), indexindex)series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64series.resample(30S).bfill()[0:5]
2000-01-01 00:00:00 0
2000-01-01 00:00:30 1
2000-01-01 00:01:00 1
2000-01-01 00:01:30 2
2000-01-01 00:02:00 2
Freq: 30S, dtype: int64通过 apply 方法传递自定义函数 import pandas as pdindex pd.date_range(1/1/2000, periods9, freqT)series pd.Series(range(9), indexindex)series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64def custom_resampler(array_like):return np.sum(array_like) 5 series.resample(3T).apply(custom_resampler)
2000-01-01 00:00:00 8
2000-01-01 00:03:00 17
2000-01-01 00:06:00 26
Freq: 3T, dtype: int64convention 参数的应用 import pandas as pds pd.Series([1, 2], indexpd.period_range(2012-01-01, freqA, periods2))s
2012 1
2013 2
Freq: A-DEC, dtype: int64s.resample(Q, conventionstart).asfreq()
2012Q1 1.0
2012Q2 NaN
2012Q3 NaN
2012Q4 NaN
2013Q1 2.0
2013Q2 NaN
2013Q3 NaN
2013Q4 NaN
Freq: Q-DEC, dtype: float64s.resample(Q, conventionend).asfreq()
2012Q4 1.0
2013Q1 NaN
2013Q2 NaN
2013Q3 NaN
2013Q4 2.0
Freq: Q-DEC, dtype: float64import pandas as pdq pd.Series([1, 2, 3, 4], indexpd.period_range(2018-01-01, freqQ, periods4))q
2018Q1 1
2018Q2 2
2018Q3 3
2018Q4 4
Freq: Q-DEC, dtype: int64q.resample(M, conventionend).asfreq()
2018-03 1.0
2018-04 NaN
2018-05 NaN
2018-06 2.0
2018-07 NaN
2018-08 NaN
2018-09 3.0
2018-10 NaN
2018-11 NaN
2018-12 4.0
Freq: M, dtype: float64q.resample(M, conventionstart).asfreq()
2018-01 1.0
2018-02 NaN
2018-03 NaN
2018-04 2.0
2018-05 NaN
2018-06 NaN
2018-07 3.0
2018-08 NaN
2018-09 NaN
2018-10 4.0
2018-11 NaN
2018-12 NaN
Freq: M, dtype: float64对于 DataFrame 对象可以使用关键字 on 来指定原数据中的某列为重采样后数据的行索引 import pandas as pdd dict({price: [10, 11, 9, 13, 14, 18, 17, 19],volume: [50, 60, 40, 100, 50, 100, 40, 50]})df pd.DataFrame(d)df[week_starting] pd.date_range(01/01/2018, periods8, freqW)dfprice volume week_starting
0 10 50 2018-01-07
1 11 60 2018-01-14
2 9 40 2018-01-21
3 13 100 2018-01-28
4 14 50 2018-02-04
5 18 100 2018-02-11
6 17 40 2018-02-18
7 19 50 2018-02-25df.resample(M, onweek_starting).mean()price volume
week_starting
2018-01-31 10.75 62.5
2018-02-28 17.00 60.0对于具有层级索引MultiIndex的 DataFrame 对象可以使用关键字 level 来指定需要在哪个级别上进行重新采样 import pandas as pddays pd.date_range(1/1/2000, periods4, freqD)d2 dict({price: [10, 11, 9, 13, 14, 18, 17, 19],volume: [50, 60, 40, 100, 50, 100, 40, 50]})df2 pd.DataFrame(d2, indexpd.MultiIndex.from_product([days, [morning, afternoon]]))df2price volume
2000-01-01 morning 10 50afternoon 11 60
2000-01-02 morning 9 40afternoon 13 100
2000-01-03 morning 14 50afternoon 18 100
2000-01-04 morning 17 40afternoon 19 50df2.resample(D, level0).sum()price volume
2000-01-01 21 110
2000-01-02 22 140
2000-01-03 32 150
2000-01-04 36 90这里是一段防爬虫文本请读者忽略。
本文原创首发于 CSDN作者 TRHX。
博客首页https://itrhx.blog.csdn.net/
本文链接https://itrhx.blog.csdn.net/article/details/106947061
未经授权禁止转载恶意转载后果自负尊重原创远离剽窃