![5025d8f19352b57904d41692f77dfdd0.png](https://i-blog.csdnimg.cn/blog_migrate/5f4be5398d943fd9fce0b3cb30f8ecf5.jpeg)
时间模块:datetime
1.datetime.date:date对象 年月日
- datetime.date.today()
- 该对象类型为datetime.date
- 可以通过str函数转化为str
In
2.datetime.datetime:datetime对象 年月日时分秒-
- datetime.datetime.now() datetime.datetime.today()
- 对象类型为datetime.datetime
- 可以通过str函数转为str
In
- 创建datetime对象:datetime.datetime(x,x,x,x,x)
- 无时间默认0点
In
- 相减得到时间差
In [13]: t2-t1
Out[13]: datetime.timedelta(days=-882, seconds=45873)
3.datetime.timedelta:时间差
- datetime.timedelta(number)
In
(pandas的datetime和period具体里都可以精确到秒,只是总体上看单个datetime输出是单日,单个period输出是时期)
Pandas的单日:Datetime
(Pandas时刻数据:Timestamp) 与 (Pandas 时间戳索引:DatetimeIndex)
输入的日期各种格式都可以解析,但无法支持中文
'2017-12-21' '20170101' '1/13/2017' '2017/1/1'
1 介绍
1.创建单个timestamp:
- pd.Timestamp(时间数据) 年月日时分秒
In [20]: t1 = pd.Timestamp( datetime.datetime(2016,12,1,12,45,30) )
In [21]: t2 = pd.Timestamp('2017-12-21')
In [24]: t3 = pd.Timestamp('2017-12-21 15:00:22')
In [25]: print(t3)
2017-12-21 15:00:22
In [22]: print(t1,type(t1))
2016-12-01 12:45:30 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
In [23]: print(t2,type(t2))
2017-12-21 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
- pd.to_datetime(时间数据)
In
2. 创建时间戳索引:
- pd.to_datetime(时间数据)
- 序列中夹着其他数据时:一定要参数errors = ‘ignore’(直接生成一般数组)/‘coerce’(缺失值生成NaT,返回datetimeindex
In [29]: st_date = [ '2017-12-21', '2017-12-22', '2017-12-23']
In [30]: t3 = pd.to_datetime(st_date)
In [31]: print(t3,type(t3))
DatetimeIndex(['2017-12-21', '2017-12-22', '2017-12-23'], dtype='datetime64[ns]', freq=None) <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
# 参数errors
In [35]: date3 = ['2017-2-1','2017-2-2','2017-2-3','hello world!','2017-2-5','2017-2-6']
In [36]: t3 = pd.to_datetime(date3, errors = 'ignore')
In [37]: t4 = pd.to_datetime(date3, errors = 'coerce')
In [38]: t5 = pd.to_datetime(date3) # 报错
In [39]: print(t3, type(t3))
Index(['2017-2-1', '2017-2-2', '2017-2-3', 'hello world!', '2017-2-5',
'2017-2-6'],
dtype='object') <class 'pandas.core.indexes.base.Index'>
In [40]: print(t4, type(t4))
DatetimeIndex(['2017-02-01', '2017-02-02', '2017-02-03', 'NaT', '2017-02-05',
'2017-02-06'],
dtype='datetime64[ns]', freq=None) <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
- pd.DatetimeIndex()
In
2 生成日期范围:pd.date_range
pd.date_range(start=None, end=None, periods=None, freq='D', tz=None, normalize=False, name=None, closed=None)
start 、 end 、 freq
1.通过start-end 与 start/end-periods生成
In
2. normalize使时间正则化到0:00:00,name是索引对象名称
In
3.区间closed
- 'None' 左闭右闭
- 'left' 左闭右开
- 'right' 左开右闭
In
4. 直接转为list,元素为timestamp
In
5. 生成时间序列
- DatetimeIndex作为索引
In [115]: rng
Out[115]:
DatetimeIndex(['2017-12-01', '2017-12-02', '2017-12-03', '2017-12-04',
'2017-12-05'],
dtype='datetime64[ns]', freq=None)
In [116]: st = pd.Series(np.random.rand(len(rng)),index = rng)
In [117]: print(st,type(st))
2017-12-01 0.757929
2017-12-02 0.392926
2017-12-03 0.192349
2017-12-04 0.238323
2017-12-05 0.297794
dtype: float64 <class 'pandas.core.series.Series'>
In [118]: print(st.index)
DatetimeIndex(['2017-12-01', '2017-12-02', '2017-12-03', '2017-12-04',
'2017-12-05'],
dtype='datetime64[ns]', freq=None)
3 生成日期范围的频率调整:freq
默认左闭右闭
1.日分秒
- 默认freq = 'D' 每日历日,'7D' 每七天
- B 每工作日; H 每小时(只到end的0:00:00); T/MIN 每分;S 每秒
- '2h30min' 每两个半小时
- L 每毫秒(千分之一秒); U每微秒(百万分之一秒)
# 默认
In [25]: print(pd.date_range('20170101','20170104'))
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04'], dtype='datetime64[ns]', freq='D')
# 工作日
In [26]: print(pd.date_range('20170101','20170104',freq = 'B'))
DatetimeIndex(['2017-01-02', '2017-01-03', '2017-01-04'], dtype='datetime64[ns]', freq='B')
# 时
In [28]: print(pd.date_range('20170101','20170102',freq = 'H'))
DatetimeIndex(['2017-01-01 00:00:00', '2017-01-01 01:00:00',
'2017-01-01 02:00:00', '2017-01-01 03:00:00',
'2017-01-01 04:00:00', '2017-01-01 05:00:00',
'2017-01-01 06:00:00', '2017-01-01 07:00:00',
'2017-01-01 08:00:00', '2017-01-01 09:00:00',
'2017-01-01 10:00:00', '2017-01-01 11:00:00',
'2017-01-01 12:00:00', '2017-01-01 13:00:00',
'2017-01-01 14:00:00', '2017-01-01 15:00:00',
'2017-01-01 16:00:00', '2017-01-01 17:00:00',
'2017-01-01 18:00:00', '2017-01-01 19:00:00',
'2017-01-01 20:00:00', '2017-01-01 21:00:00',
'2017-01-01 22:00:00', '2017-01-01 23:00:00',
'2017-01-02 00:00:00'],
dtype='datetime64[ns]', freq='H')
# 分
In [29]: print(pd.date_range('2017/1/1 12:00','2017/1/1 12:10',freq = 'T'))
...:
DatetimeIndex(['2017-01-01 12:00:00', '2017-01-01 12:01:00',
'2017-01-01 12:02:00', '2017-01-01 12:03:00',
'2017-01-01 12:04:00', '2017-01-01 12:05:00',
'2017-01-01 12:06:00', '2017-01-01 12:07:00',
'2017-01-01 12:08:00', '2017-01-01 12:09:00',
'2017-01-01 12:10:00'],
dtype='datetime64[ns]', freq='T')
# 七天
In [54]: print(pd.date_range('2017/1/1','2017/2/1',freq = '7D'))
DatetimeIndex(['2017-01-01', '2017-01-08', '2017-01-15', '2017-01-22',
'2017-01-29'],
dtype='datetime64[ns]', freq='7D')
2. 工作日频率:pd.bdate_range()、 freq ='B'
In [35]: print(pd.bdate_range('20170101','20170107'))
DatetimeIndex(['2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05',
'2017-01-06'],
dtype='datetime64[ns]', freq='B')
In [36]: print(pd.date_range('20170101','20170107',freq = 'B'))
DatetimeIndex(['2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05',
'2017-01-06'],
dtype='datetime64[ns]', freq='B')
3. 星期x对应的日期
- 星期x的缩写:MON/TUE/WED/THU/FRI/SAT/SUN
- 'W-MON' 从星期一开始算起,输出每周的星期一对应的日期
In [32]: print(pd.date_range('20170101','20170201', freq = 'W-MON'))
DatetimeIndex(['2017-01-02', '2017-01-09', '2017-01-16', '2017-01-23',
'2017-01-30'],
dtype='datetime64[ns]', freq='W-MON')
- 'WOM-2MON' 从某月的第2个星期一开始算,输出每月第二个星期一对应的日期;WOM-MON报错
In [34]: print(pd.date_range('20170101','20170501', freq = 'WOM-3MON'))
DatetimeIndex(['2017-01-16', '2017-02-20', '2017-03-20', '2017-04-17'], dtype='datetime64[ns]', freq='WOM-3MON')
虽然左闭右闭,但不输出end那一年的(因为没有)
4. 输出月最后一日
月缩写:JAN/FEB/MAR/APR/MAY/JUN/JUL/AUG/SEP/OCT/NOV/DEC
- 日历日
- 'M' 输出每月最后一个日历日,'2M' 每两个月最后一个日历日
- 'Q-月' 输出每年每个季度末最后一月的最后一个日历日:只有1-4-7-10、2-5-8-11、3-6-9-12
- 'A-月' 输出每年指定月份的最后一个日历日
In
- 工作日
- 'BM' 输出每月最后一个工作日
- 'BQ-月' 输出每年每个季度末最后一月的最后一个工作日:只有1-4-7-10、2-5-8-11、3-6-9-12
- 'BA-月' 输出每年指定月份的最后一个工作日
5. 输出每月第一日
左闭右闭,1月1号有的
- 日历日
- 'MS' 输出每月第一个日历日
- 'QS-月' 输出每年每个季度末最后一月的第一个日历日:只有1-4-7-10、2-5-8-11、3-6-9-12
- 'AS-月' 输出每年指定月份的第一个日历日
- 工作日
- 'BMS' 输出每月第一个工作日
- 'BQS-月' 输出每年每个季度末最后一月的第一个工作日:只有1-4-7-10、2-5-8-11、3-6-9-12
- 'BAS-月' 输出每年指定月份的第一个工作日
In
pandas的时期:period
1.创建时期:pd.Period('输入') 精确度到秒,大写Period
- 输入年:输出该一整年; 单位是年,加减针对年份;
In [66]: y = pd.Period('2016')
In [67]: y
Out[67]: Period('2016', 'A-DEC')
In [68]: y.start_time
Out[68]: Timestamp('2016-01-01 00:00:00')
In [69]: y.end_time
Out[69]: Timestamp('2016-12-31 23:59:59.999999999')
In [77]: (y+1).start_time
Out[77]: Timestamp('2017-01-01 00:00:00')
- 输入年月:输出该一整个月;单位是月,加减针对月份
In [70]: m = pd.Period('2019-01')
In [71]: m
Out[71]: Period('2019-01', 'M')
In [72]: print(m)
2019-01
In [73]: m.start_time
Out[73]: Timestamp('2019-01-01 00:00:00')
In [74]: m.end_time
Out[74]: Timestamp('2019-01-31 23:59:59.999999999')
In [78]: m+1
Out[78]: Period('2019-02', 'M')
- 输入年月日:输出该一天; 单位是日,加减针对日
In [80]: d = pd.Period('2019/2/12')
In [81]: d
Out[81]: Period('2019-02-12', 'D')
In [82]: d.start_time
Out[82]: Timestamp('2019-02-12 00:00:00')
In [83]: d.end_time
Out[83]: Timestamp('2019-02-12 23:59:59.999999999')
In [84]: d+1
Out[84]: Period('2019-02-13', 'D')
- 输入年月日时:输出该一小时;单位是时,加减针对时
In [87]: h = pd.Period('2019-02-13 23')
In [88]: h
Out[88]: Period('2019-02-13 23:00', 'H')
In [89]: h.start_time
Out[89]: Timestamp('2019-02-13 23:00:00')
In [90]: h.end_time
Out[90]: Timestamp('2019-02-13 23:59:59.999999999')
- freq参数
- D、A-月份、Q、Q-月份…
- 例如,输入年月日时分秒,想调整为单位为时
- 例如输入年,默认freq是'A-DEC',修改成'A-NOV' 则是输出去年12月到今年11月
# 例1
In [91]: h = pd.Period('2019-2-13 23:09:7')
In [92]: h
Out[92]: Period('2019-02-13 23:09:07', 'S')
In [93]: h = pd.Period('2019-2-13 23:09:7',freq = 'H')
In [94]: h
Out[94]: Period('2019-02-13 23:00', 'H')
# 例2
In [127]: p = pd.Period('2017','A-NOV')
In [128]: p.end_time
Out[128]: Timestamp('2017-11-30 23:59:59.999999999')
In [129]: p.start_time
Out[129]: Timestamp('2016-12-01 00:00:00')
- 输入季度:输出三个月的;单位是季度,加减针对季度
In [100]: a = pd.Period('2019Q1')
In [101]: b = pd.Period('2019Q1',freq = 'Q-NOV')
In [102]: a
Out[102]: Period('2019Q1', 'Q-DEC')
In [103]: b
Out[103]: Period('2019Q1', 'Q-NOV')
In [104]: a.start_time
Out[104]: Timestamp('2019-01-01 00:00:00')
In [105]: b.start_time
Out[105]: Timestamp('2018-12-01 00:00:00')
In [106]: a.end_time
Out[106]: Timestamp('2019-03-31 23:59:59.999999999')
In [107]: b.end_time
Out[107]: Timestamp('2019-02-28 23:59:59.999999999')
In [108]: a+1
Out[108]: Period('2019Q2', 'Q-DEC')
2. 创建时期范围PeriodIndex:pd.period_range() 小写period
- 默认左闭右闭
In [112]: prng = pd.period_range('1/1/2011','1/1/2012',freq = 'M')
In [113]: print(prng,type(prng))
PeriodIndex(['2011-01', '2011-02', '2011-03', '2011-04', '2011-05', '2011-06',
'2011-07', '2011-08', '2011-09', '2011-10', '2011-11', '2011-12',
'2012-01'],
dtype='period[M]', freq='M') <class 'pandas.core.indexes.period.PeriodIndex'>
In [114]: print(prng[0],type(prng))
2011-01 <class 'pandas.core.indexes.period.PeriodIndex'>
3. 生成时间序列
- PeriodIndex作为索引
In [119]: prng
Out[119]:
PeriodIndex(['2011-01', '2011-02', '2011-03', '2011-04', '2011-05', '2011-06',
'2011-07', '2011-08', '2011-09', '2011-10', '2011-11', '2011-12',
'2012-01'],
dtype='period[M]', freq='M')
In [120]: ts = pd.Series(np.random.rand(len(prng)),index = prng)
In [121]: print(ts,type(ts))
2011-01 0.261200
2011-02 0.610385
2011-03 0.051124
2011-04 0.859731
2011-05 0.267941
2011-06 0.162188
2011-07 0.705975
2011-08 0.972113
2011-09 0.364180
2011-10 0.643569
2011-11 0.880400
2011-12 0.797920
2012-01 0.216660
Freq: M, dtype: float64 <class 'pandas.core.series.Series'>
4. 频率转换:asfreq,参数how
- how 默认= 'end' ;'start'/'s' 'end'/'e'
- 例如输入年(freq是'A-DEC'),想改成输入年月(freq是'M')
In [156]: p = pd.Period('2017')
In [157]: p
Out[157]: Period('2017', 'A-DEC')
In [158]: p.asfreq('M')
Out[158]: Period('2017-12', 'M')
In [177]: p.asfreq('M',how = 's')
Out[177]: Period('2017-01', 'M')
- asfreq与参数freq的不同
# freq
In [169]: prng = pd.period_range('2017','2018',freq = 'D')
...: ts1 = pd.Series(np.random.rand(len(prng)), index = prng)
In [170]: print(ts1)
2017-01-01 0.660063
2017-01-02 0.740546
2017-01-03 0.151273
2017-01-04 0.516786
2017-01-05 0.649403
...
2017-12-28 0.278588
2017-12-29 0.931156
2017-12-30 0.810954
2017-12-31 0.993095
2018-01-01 0.875567
Freq: D, Length: 366, dtype: float64
# asfreq
In [179]: prng = pd.Period_range('2017','2018',freq='M')
In [183]: print(pd.Series(np.random.rand(len(prng)), index = prng.asfreq('D
...: ',how = 's')))
2017-01-01 0.683564
2017-02-01 0.319375
2017-03-01 0.528540
2017-04-01 0.168152
2017-05-01 0.202154
2017-06-01 0.112052
2017-07-01 0.593580
2017-08-01 0.280926
2017-09-01 0.210957
2017-10-01 0.531630
2017-11-01 0.411702
2017-12-01 0.309302
2018-01-01 0.395721
Freq: D, dtype: float64