第一种传入 开始和结束时间:
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')
第二种 传入开始时间和 时间间隔
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')
第三种 传入结束时间和时间间隔
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')
如果需要一段时间中的特定频率的时间 比如每月最后一个工作日 可以传入 freq 参数
pd.date_range('1/1/2000', '12/1/2000', freq='BM')
DatetimeIndex(['2000-01-31', '2000-02-29', '2000-03-31', '2000-04-28',
'2000-05-31', '2000-06-30', '2000-07-31', '2000-08-31',
'2000-09-29', '2000-10-31', '2000-11-30'],
dtype='datetime64[ns]', freq='BM')
更多频率选项如下:
别名 | 偏移量类型 | 说明 |
D | Day | 每日历日 |
B | BusinessDay | 每工作日 |
H | Hour | 每小时 |
T/min | Minute | 每分 |
S | Second | 每秒 |
L/ms | Million | 每毫秒 |
U | Micro | 每微妙 |
M | MonthEnd | 每月最后一个日历日 |
BM | BusinessMonthEnd | 每月最后一个工作日 |
MS | MonthBegin | 每月第一个日历日 |
BMS | BusinessMonthBegin | 每月第一个工作日 |
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 | 每月指定月份第一个工作日 |
如果我们传入的是一个带有时间戳的日期 但是希望产生得到的时间都被规范到午夜,可以传入 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')
shifting 值得是沿着时间轴将数据迁移或者后移(索引不变)在计算百分比变化时候( 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
pandas 的日期偏移量还可以用在datetime 或者 Timestamp 对象上:
from pandas.tseries.offsets import Day, MonthEnd
now = datetime(2011, 11, 17)
now + 3 * Day()
Timestamp('2011-11-20 00:00:00')
如果加的是锚点偏移量(比如 MonthEnd 当月月底) 第一次增量会将原日期向前滚动到符合频率规则的下一个日期:
now + MonthEnd()
Timestamp('2011-11-30 00:00:00')
通过锚点偏移量的rollforward 和rollback 方法,可以显式地将日期向前或者向后‘滚动’
offset = MonthEnd()
offset.rollforward(now)
Timestamp('2011-11-30 00:00:00')
这里还有个巧妙的用法,结合groupby 和滚动方法 :
ts = Series(np.random.randn(20),
index=pd.date_range('1/15/2000', periods=20, freq='4d'))
ts
2000-01-15 -0.254893
2000-01-19 1.720944
2000-01-23 0.813963
2000-01-27 -0.378527
2000-01-31 0.251629
2000-02-04 -1.539826
...
2000-03-11 1.406805
2000-03-15 -1.528163
2000-03-19 0.659940
2000-03-23 0.575431
2000-03-27 -1.141056
2000-03-31 0.092857
Freq: 4D, Length: 20, dtype: float64
ts.groupby(offset.rollforward).mean()
2000-01-31 0.430623
2000-02-29 -0.644033
2000-03-31 0.226914
dtype: float64