pd.DatetimeIndex()可以直接生成时间戳索引,支持使用str、datetime.datetime。
单个时间戳的类型为Timestamp,多个时间戳的类型为DatetimeIndex,示例如下:
rng = pd.DatetimeIndex([‘12/1/2017‘,‘12/2/2017‘,‘12/3/2017‘,‘12/4/2017‘,‘12/5/2017‘])
print(rng,type(rng))
print(rng[0],type(rng[0]))
>>>
DatetimeIndex([‘2017-12-01‘, ‘2017-12-02‘, ‘2017-12-03‘, ‘2017-12-04‘,
‘2017-12-05‘],
dtype=‘datetime64[ns]‘, freq=None) <class ‘pandas.core.indexes.datetimes.DatetimeIndex‘>
2017-12-01 00:00:00 <class ‘pandas._libs.tslibs.timestamps.Timestamp‘>
以DatetimeIndex为index的Series,为TimeSries时间序列
举个栗子:
st = pd.Series(np.random.rand(len(rng)), index = rng)
print(st,type(st))
print(st.index)
>>>
2017-12-01 0.081920
2017-12-02 0.921781
2017-12-03 0.489779
2017-12-04 0.257632
2017-12-05 0.805373
dtype: float64 <class ‘pandas.core.series.Series‘>
DatetimeIndex([‘2017-12-01‘, ‘2017-12-02‘, ‘2017-12-03‘, ‘2017-12-04‘,
‘2017-12-05‘],
dtype=‘datetime64[ns]‘, freq=None)
pd.date_range()生成日期范围有两种生成方式(默认频率是day):
起始时间(start) + 结束时间(end)
举个栗子:
date1 = pd.date_range(‘2017/1/1‘,‘2017/10/1‘,normalize=True)
print(date1)
date2 = pd.date_range(start = ‘1/1/2017‘, periods = 10)
print(date2)
date3 = pd.date_range(end = ‘1/30/2017 15:00:00‘, periods = 10,normalize=True) # 增加了时、分、秒
print(date3)
>>>
DatetimeIndex([‘2017-01-01‘, ‘2017-01-02‘, ‘2017-01-03‘, ‘2017-01-04‘,
‘2017-01-05‘, ‘2017-01-06‘, ‘2017-01-07‘, ‘2017-01-08‘,
‘2017-01-09‘, ‘2017-01-10‘,
...
‘2017-09-22‘, ‘2017-09-23‘, ‘2017-09-24‘, ‘2017-09-25‘,
‘2017-09-26‘, ‘2017-09-27‘, ‘2017-09-28‘, ‘2017-09-29‘,
‘2017-09-30‘, ‘2017-10-01‘],
dtype=‘datetime64[ns]‘, length=274, freq=‘D‘)
DatetimeIndex([‘2017-01-01‘, ‘2017-01-02‘, ‘2017-01-03‘, ‘2017-01-04‘,
‘2017-01-05‘, ‘2017-01-06‘, ‘2017-01-07‘, ‘2017-01-08‘,
‘2017-01-09‘, ‘2017-01-10‘],
dtype=‘datetime64[ns]‘, freq=‘D‘)
DatetimeIndex([‘2017-01-21‘, ‘2017-01-22‘, ‘2017-01-23‘, ‘2017-01-24‘,
‘2017-01-25‘, ‘2017-01-26‘, ‘2017-01-27‘, ‘2017-01-28‘,
‘2017-01-29‘, ‘2017-01-30‘],
dtype=‘datetime64[ns]‘, freq=‘D‘)
pd.date_range(start=None, end=None, periods=None, freq=‘D‘, tz=None, normalize=False, name=None, closed=None, **kwargs)
其中常用参数含义如下:
start:开始时间
end:结束时间
periods:偏移量
freq:频率,默认天,pd.date_range()默认频率为日历日,pd.bdate_range()默认频率为工作日
tz:时区
normalize:时间参数值正则化到午夜时间戳
举个栗子对normalize参数进行实际运用:
rng4 = pd.date_range(start = ‘1/1/2017 15:30‘, periods = 10, name = ‘hello world!‘, normalize = True)
print(rng4)
>>>
DatetimeIndex([‘2017-01-01‘, ‘2017-01-02‘, ‘2017-01-03‘, ‘2017-01-04‘,
‘2017-01-05‘, ‘2017-01-06‘, ‘2017-01-07‘, ‘2017-01-08‘,
‘2017-01-09‘, ‘2017-01-10‘],
dtype=‘datetime64[ns]‘, name=‘hello world!‘, freq=‘D‘)
基础使用如下:
print(pd.date_range(‘2017/1/1‘,‘2017/1/4‘)) # 默认freq = ‘D‘:每日历日
print(pd.date_range(‘2017/1/1‘,‘2017/1/4‘, freq = ‘B‘)) # B:每工作日
print(pd.date_range(‘2017/1/1‘,‘2017/1/2‘, freq = ‘H‘)) # H:每小时
print(pd.date_range(‘2017/1/1 12:00‘,‘2017/1/1 12:10‘, freq = ‘T‘)) # T/MIN:每分
print(pd.date_range(‘2017/1/1 12:00:00‘,‘2017/1/1 12:00:10‘, freq = ‘S‘)) # S:每秒
print(pd.date_range(‘2017/1/1 12:00:00‘,‘2017/1/1 12:00:10‘, freq = ‘L‘)) # L:每毫秒(千分之一秒)
print(pd.date_range(‘2017/1/1 12:00:00‘,‘2017/1/1 12:00:10‘, freq = ‘U‘)) # U:每微秒(百万分之一秒)
进阶使用如下:
print(pd.date_range(‘2017/1/1‘,‘2017/2/1‘, freq = ‘W-MON‘))
# W-MON:从指定星期几开始算起,每周
# 星期几缩写:MON/TUE/WED/THU/FRI/SAT/SUN
print(pd.date_range(‘2017/1/1‘,‘2017/5/1‘, freq = ‘WOM-2MON‘))
# WOM-2MON:每月的第几个星期几开始算,这里是每月第二个星期一
生成指定频率的日历日:
print(pd.date_range(‘2017‘,‘2018‘, freq = ‘M‘))
print(pd.date_range(‘2017‘,‘2020‘, freq = ‘Q-DEC‘))
print(pd.date_range(‘2017‘,‘2020‘, freq = ‘A-DEC‘))
print(‘------‘)
# M:每月最后一个日历日
# Q-月:指定月为季度末,每个季度末最后一月的最后一个日历日
# A-月:每年指定月份的最后一个日历日
# 月缩写:JAN/FEB/MAR/APR/MAY/JUN/JUL/AUG/SEP/OCT/NOV/DEC
# 所以Q-月只有三种情况:1-4-7-10,2-5-8-11,3-6-9-12
生成指定频率的工作日:
print(pd.date_range(‘2017‘,‘2018‘, freq = ‘BM‘))
print(pd.date_range(‘2017‘,‘2020‘, freq = ‘BQ-DEC‘))
print(pd.date_range(‘2017‘,‘2020‘, freq = ‘BA-DEC‘))
print(‘------‘)
# BM:每月最后一个工作日
# BQ-月:指定月为季度末,每个季度末最后一月的最后一个工作日
# BA-月:每年指定月份的最后一个工作日
生成指定规律的特殊时间:
print(pd.date_range(‘2017‘,‘2018‘, freq = ‘MS‘))
print(pd.date_range(‘2017‘,‘2020‘, freq = ‘QS-DEC‘))
print(pd.date_range(‘2017‘,‘2020‘, freq = ‘AS-DEC‘))
print(‘------‘)
# M:每月第一个日历日
# QS-月:指定月为季度末,每个季度末最后一月的第一个日历日
# AS-月:每年指定月份的第一个日历日
print(pd.date_range(‘2017‘,‘2018‘, freq = ‘BMS‘))
print(pd.date_range(‘2017‘,‘2020‘, freq = ‘BQS-DEC‘))
print(pd.date_range(‘2017‘,‘2020‘, freq = ‘BAS-DEC‘))
print(‘------‘)
# BMS:每月第一个工作日
# BQS-月:指定月为季度末,每个季度末最后一月的第一个工作日
# BAS-月:每年指定月份的第一个工作日
生成指定复合频率的时间序列:
print(pd.date_range(‘2017/1/1‘,‘2017/2/1‘, freq = ‘7D‘)) # 7天
print(pd.date_range(‘2017/1/1‘,‘2017/1/2‘, freq = ‘2h30min‘)) # 2小时30分钟
print(pd.date_range(‘2017‘,‘2018‘, freq = ‘2M‘)) # 每间隔2个月的第一个日历日
以天为间隔频率的时间序列如何修改为更小单位间隔的时间序列?
ts = pd.Series(np.random.rand(4),
index = pd.date_range(‘20170101‘,‘20170104‘))
print(ts)
print(ts.asfreq(‘4H‘,method = ‘ffill‘))
# 改变频率,这里是D改为4H
# method:插值模式,None不插值,ffill用之前值填充,bfill用之后值填充
下面栗子超前/滞后的数据移动的是数值:
```
ts = pd.Series(np.random.rand(4),
index = pd.date_range(‘20170101‘,‘20170104‘))
print(ts)
print(ts.shift(2))
print(ts.shift(-2))
print(‘------‘)
2017-01-01 0.575076
2017-01-02 0.514981
2017-01-03 0.221506
2017-01-04 0.410396
Freq: D, dtype: float64
2017-01-01 NaN
2017-01-02 NaN
2017-01-03 0.575076
2017-01-04 0.514981
Freq: D, dtype: float64
2017-01-01 0.221506
2017-01-02 0.410396
2017-01-03 NaN
2017-01-04 NaN
Freq: D, dtype: float64而加上freq偏移参数则偏移的的是前面的索引时间戳而不是数值:
print(ts.shift(2, freq = ‘D‘))
print(ts.shift(2, freq = ‘T‘))加上freq参数:对时间戳进行位移,而不是对数值进行位移
## 巩固练习
原文:https://blog.51cto.com/15072780/2581404