pandas中的几个时间序列生成函数

最近在处理跟时间相关的数据,用到了pandas中的datetime的几个函数,本篇来说一下pandas中几个常见的时间序列生成函数。

  1. 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天。

  2. 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是没有这个的,从始至终它都返回日期(有设定时间也会把时间返回)。

  1. pd.timedelta_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')
'''
  1. pd.interval_range函数

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关于时间序列的函数的总结,有遗漏的欢迎小伙伴在评论区补充哦,大家一起学习(#.#)。