pandas中的几个时间序列生成函数
最近在处理跟时间相关的数据,用到了pandas中的datetime的几个函数,本篇来说一下pandas中几个常见的时间序列生成函数。
-
pd.date_range函数
pd.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None)
先来讲一下各参数的含义:
- start:即开始时间,得是字符形式的,如"2020-1-9";
- end:结束时间,格式同start;
- periods:生成的时间个数;
- freq:生成时间的间隔频率,不写默认“D”;我列出常用的几个:
freq别称 说明/以下述为频率 B 工作日 C 自定义工作日 D 日历的日期 W 周 M 月末 Q 季度末 Y 年末 H 小时 T 分钟 S 秒 MS 月初 QS 季度初 YS 年初 SMS 前半月(1号和15号) - tz:设置时区,如设置上海时间–“Asia/Shanghai”;
- normalize:是否在生成序列前将start或end的日期设为凌晨00点;默认False;
- name:设置该时间序列的名称;
- closed:有三个值–None、left、right,设置是否为闭区间,默认为None,全闭。
接着可以看一个示例:
date = pd.date_range(start="2019-9-15", periods=7, freq="2SMS", tz="Asia/Shanghai") date ''' 返回: DatetimeIndex(['2019-09-15 00:00:00+08:00', '2019-10-15 00:00:00+08:00', '2019-11-15 00:00:00+08:00', '2019-12-15 00:00:00+08:00', '2020-01-15 00:00:00+08:00', '2020-02-15 00:00:00+08:00', '2020-03-15 00:00:00+08:00'], dtype='datetime64[ns, Asia/Shanghai]', freq='2SMS-15') '''
可以看到,加上时区之后多加了8个小时;同时
freq
里并不是单纯的示例格式,反而多了一个2,可以这样计算:原SMS代表半月即15天,加上2之后代表乘以2,即变为了30天。 -
pd.period_range函数
- pd.period_range(start=None, end=None, periods=None, freq=None, name=None)
参数意思都是一样的,因此就不解释了。直接上厘子例子。
# 频率默认以“天”算
period = pd.period_range(start="2019-2-2", periods=2)
period
'''
返回:
PeriodIndex(['2019-02-02', '2019-02-03'], dtype='period[D]', freq='D')
'''
单这样看肯定会觉得和date_range
函数没有多大区别,最多只是数据类型不一样。不过无需着急,接下来我再放几个该函数的例子,一对比,就能很快发现区别。
# 频率以“季度”算
period = pd.period_range(start="2019-2-2", periods=2, freq="Q")
period
'''
返回:
PeriodIndex(['2019Q1', '2019Q2'], dtype='period[Q-DEC]', freq='Q-DEC')
'''
# 频率以“月”算
period = pd.period_range(start="2019-2-2", periods=2, freq="M")
period
'''
返回:
PeriodIndex(['2019-02', '2019-03'], dtype='period[M]', freq='M')
'''
# 频率以“年”算
period = pd.period_range(start="2019-2-2", periods=2, freq="Y")
period
'''
返回:
PeriodIndex(['2019', '2020'], dtype='period[A-DEC]', freq='A-DEC')
'''
很明显,date_range
是没有这个的,从始至终它都返回日期(有设定时间也会把时间返回)。
pd.timedelta_range(start=None, end=None, periods=None, freq=None, name=None, closed=None)
个人感觉这个函数相对用得少,还没在实际中真正用到过这个函数。它返回的是天数,以小于等于天的单位做频率,小时、秒都行。代码示例中用的是小时。(H前的数字代表倍数,5个小时)
delta = pd.timedelta_range(start="1 day", periods=3, freq="5H")
delta
'''
返回:
TimedeltaIndex(['1 days 00:00:00', '1 days 05:00:00', '1 days 10:00:00'], dtype='timedelta64[ns]', freq='5H')
'''
pd.interval_range(start=None, end=None, periods=None, freq=None, name=None, closed='right')
这个函数可以返回时间区间,也可以返回数值区间。
唯一需要注意的是:若要返回时间区间,start和end的参数不能直接写时间字符串(“2020-9-1”),应该用上
pd.Timestamp(时间)
。
# 返回时间区间
interval = pd.interval_range(start=pd.Timestamp("2020-1-15"), end=pd.Timestamp("2020-3-15"), freq="2SMS")
interval
'''
返回:
IntervalIndex([(2020-01-15, 2020-02-15], (2020-02-15, 2020-03-15]],
closed='right',
dtype='interval[datetime64[ns]]')
'''
# 返回数值区间
interval = pd.interval_range(start=0, end=10)
interval
'''
返回:
IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5], (5, 6], (6, 7], (7, 8], (8, 9], (9, 10]],
closed='right',
dtype='interval[int64]')
'''
以上就是pandas关于时间序列的函数的总结,有遗漏的欢迎小伙伴在评论区补充哦,大家一起学习(#.#)。