Pandas —— 日期范围date_range()、移动数据shift()及日期位移rollforward()和rollback()

本文介绍了Pandas中用于日期处理的三个关键功能:date_range用于生成日期范围,shift实现数据在时间轴上的移动,以及日期位移的rollforward和rollback方法,帮助理解如何在时间序列上进行精确操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日期范围date_range()

生成日期范围

1、传入开始和结束时间

index = pd.date_range('4/1/2012', '6/1/2012')  #默认按天计算
index

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'],
              dtype='datetime64[ns]', freq='D')

2、 传入开始时间和时间间隔

pd.date_range(start='4/1/2012', periods=20)

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'],
              dtype='datetime64[ns]', freq='D')

3、传入结束时间和时间间隔

pd.date_range(end='6/1/2012', periods=20)

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'],
              dtype='datetime64[ns]', freq='D')

normalize规范化

如果我们传入的是一个带有时间戳的日期 但是希望产生得到的时间都被规范到午夜,可以传入 normalize 选项

pd.date_range('5/2/2012 12:56:31', periods=5, normalize=True)

DatetimeIndex(['2012-05-02', '2012-05-03', '2012-05-04', '2012-05-05',
               '2012-05-06'],
              dtype='datetime64[ns]', freq='D')

freq指定频率

pd.date_range('5/2/2012 12:56:31', periods=5, normalize=True,freq="M")

DatetimeIndex(['2012-05-31', '2012-06-30', '2012-07-31', '2012-08-31',
               '2012-09-30'],
              dtype='datetime64[ns]', freq='M')
别名偏移量类型说明
DDay每日历日
BBusinessDay每工作日
HHour每小时
T/minMinute每分
SSecond每秒
L/msMillion每毫秒
UMicro每微妙
MMonthEnd每月最后一个日历日
BMBusinessMonthEnd每月最后一个工作日
MSMonthBegin每月第一个日历日
BMSBusinessMonthBegin每月第一个工作日
W-MON、W-TUE…Week从指定的星期几开始算起,每周
WOM-1MON、WOM-2MON…WeekOfMonth产生每月第一、二、三、四周的星期几,例如WOM-1MON表示每月的第一个星期一
Q-JAN、Q-FEB…QuarterEnd对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的最后一个日历日
BQ-JAN、BQ-FEB…BusinessQuarterEnd对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的最后一个工作日
QS-JAN、QS-FEB…QuarterBegin对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的第一个日历日
BQS-JAN、BQS-FEB…BusinessQuarterBegin对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的第一个工作日
A-JAN、A-FEB…YearEnd每年指定月份最后一个日历日
BA-JAN、BA-FEB…BusinessYearEnd每年指定月份最后一个工作日
AS-JAN、AS-FEB…YearBegin每月指定月份第一个日历日
BAS-JAN、BAS-FEB…BusinessYearBegin每月指定月份第一个工作日

移动数据shift()

shift()是指在索引不变的条件下,沿着时间轴将数据迁移或者后移。通常用于计算时间序列中百分比的变化,即:ts/ts.shift(1)-1

ts = Series(np.random.randn(4),index=pd.date_range('1/1/2000', periods=4, freq='M'))
ts

2000-01-31   -0.189082
2000-02-29    0.149103
2000-03-31    0.619038
2000-04-30    0.666174
Freq: M, dtype: float64

ts.shift(2)

2000-01-31         NaN
2000-02-29         NaN
2000-03-31   -0.189082
2000-04-30    0.149103
Freq: M, dtype: float64


ts.shift(-2)

2000-01-31    0.619038
2000-02-29    0.666174
2000-03-31         NaN
2000-04-30         NaN
Freq: M, dtype: float64

如果这时候传入 freq 参数就会按频率移动

ts.shift(2, freq='M')

2000-03-31   -0.209000
2000-04-30   -0.897647
2000-05-31   -0.562144
2000-06-30    0.171139
Freq: M, dtype: float64

日期位移

如果是日期偏移量

from pandas.tseries.offsets import Day, MonthEnd
now = datetime(2011, 11, 17)
now + 3 * Day()
Timestamp('2011-11-20 00:00:00')

如果加的是锚点偏移量(比如 MonthEnd 当月月底) 第一次增量会将原日期向前滚动到符合频率规则的下一个日期:

offset = MonthEnd()
offset.rollforward(now)
Timestamp('2011-11-30 00:00:00')

通过锚点偏移量的rollforward 和rollback 方法,可以显式地将日期向前或者向后‘滚动’

offset = MonthEnd()
offset.rollforward(now)
Timestamp('2011-11-30 00:00:00')
offset.rollback(now)
Timestamp('2011-10-31 00:00:00')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值