pandas中的时间处理

创建时间索引的Series

通过datetime的list创建Series,

import pandas as pd
from pandas import Series, DataFrame
from datetime import datetime
date_list = [
    datetime(2015,9,1),
    datetime(2015,9,10),
    datetime(2016,10,10),
    datetime(2016,10,12),
    datetime(2017,10,12)]
s1 = Series(np.random.randn(5),index=date_list)

print(s1)
2019-01-01    0.579559
2019-01-02    0.189730
2019-01-03   -0.749135
2019-01-04    0.599295
2019-01-05   -1.029085
dtype: float64

s1.index
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05'],
              dtype='datetime64[ns]', freq=None)
  pandas 会将datetime的数组存储在DatetimeIndex中

s1.index[0]
Timestamp('2019-01-01 00:00:00')
pandas将datetime类型转化为了pandas中的pandas._libs.tslibs.timestamps.Timestamp类型 存储在了DatetimeIndex中
索引时间Series

pandas中时间索引的Series的索引方式

  1. 基于标签索引
t1 = s1.index[0]
s1[t1]
0.579559302102843
  1. 基于日期字符换索引
s1['20190101']
s1['2019-01-01']
s1['2019/01/05']
以上的方式都可以获取正确的value值,证明pandas内部有日期格式自动匹配模式。
  1. 基于年份和月份进行数据切片
long_ts = pd.Series(np.random.randn(15),pd.date_range('20181225',periods=15))
2018-12-25   -0.182188
2018-12-26   -0.824226
2018-12-27    0.553895
2018-12-28   -1.028436
2018-12-29   -0.352218
2018-12-30   -1.419503
2018-12-31    0.452379
2019-01-01    0.130104
2019-01-02    1.411735
2019-01-03   -0.177678
2019-01-04   -1.426672
2019-01-05   -1.015171
2019-01-06   -1.965249
2019-01-07   -1.066869
2019-01-08    1.133833
Freq: D, dtype: float64
基于年份索引
long_ts['2018']
基于月份索引
long_ts['2018-12']
  1. 使用datetime对Series进行切片
long_ts[datetime(2019,1,1):datetime(2019,1,5)]
2019-01-01    0.130104
2019-01-02    1.411735
2019-01-03   -0.177678
2019-01-04   -1.426672
2019-01-05   -1.015171
Freq: D, dtype: float64
  1. 基于字符串范围切片
long_ts['20190102':'20190104']   
long_ts['2019-01-02':'2019-01-04']
  1. trruncate 切片函数
long_ts.truncate(before='20190101',after='20190105') 
注意:before为开始时间,after为结束时间。为闭区间切片,既包含before和after本身
2019-01-01    0.130104
2019-01-02    1.411735
2019-01-03   -0.177678
2019-01-04   -1.426672
2019-01-05   -1.015171
Freq: D, dtype: float64
生成范围日期

pd中的date_range函数可以生成指定范围的DatetimeIndex对象

pd.date_range(start='20120401','20120601')
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-05-31', '2012-06-01'],
              dtype='datetime64[ns]', freq='D')
  
  如果只指定了一个start或end时间,可以通过periods设置日期的数量
pd.date_range(start='20120401',periods=20)

频率设定:默认date_range 会生成范围内的所有自然日的日期,可以通过freq设置范围内日期的选择方式,
如选择工作日 freq = 'B' ,每个月的最后一个工作日'BM'
pd.date_range(start='20190101',end='20191231',freq='BM')
DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-29', '2019-04-30',
               '2019-05-31', '2019-06-28', '2019-07-31', '2019-08-30',
               '2019-09-30', '2019-10-31', '2019-11-29', '2019-12-31'],
              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 将时间格式化为0点

pd.date_range(start='20190101 5:12',periods=5,normalize=False)

DatetimeIndex(['2019-01-01 05:12:00', '2019-01-02 05:12:00',
               '2019-01-03 05:12:00', '2019-01-04 05:12:00',
               '2019-01-05 05:12:00'],
              dtype='datetime64[ns]', freq='D')
 
 pd.date_range(start='20190101 5:12',periods=5,normalize=True)
 DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05'],
              dtype='datetime64[ns]', freq='D')
组合频率

pandas中的频率是由基础频率和倍数组成的,基础频率通常为字符串别名,如M代表月份,H代表小时。一个基础频率加一个数字就可以组成倍数。如4H 代表4个小时。

pd.date_range(start='20190101',end='20190102',freq='4H')

DatetimeIndex(['2019-01-01 00:00:00', '2019-01-01 04:00:00',
               '2019-01-01 08:00:00', '2019-01-01 12:00:00',
               '2019-01-01 16:00:00', '2019-01-01 20:00:00',
               '2019-01-02 00:00:00'],
              dtype='datetime64[ns]', freq='4H')

频率的组合。pandas支持将多个基础频率组合成一个符合频率如4h30min组合。

pd.date_range(start='20190101',end='20190102',freq='4H30min')

DatetimeIndex(['2019-01-01 00:00:00', '2019-01-01 04:30:00',
               '2019-01-01 09:00:00', '2019-01-01 13:30:00',
               '2019-01-01 18:00:00', '2019-01-01 22:30:00'],
              dtype='datetime64[ns]', freq='270T')

月中某个星期的日期。如每个月的第三个周五。

pd.date_range(start='20190101',periods=4,freq='WOM-3FRI')

DatetimeIndex(['2019-01-18', '2019-02-15', '2019-03-15', '2019-04-19'], dtype='datetime64[ns]', freq='WOM-3FRI')
shift将Series中的value值丢弃掉
ts = pd.Series(np.random.randn(4),index=pd.date_range('20190101',freq='M',periods=4))

ts.shift(1) # 正数表示从开始位置开始丢弃
2019-01-31         NaN
2019-02-28   -0.320870
2019-03-31   -1.419781
2019-04-30    1.550905
Freq: M, dtype: float64

ts.shift(-2)  #负数表示从结束位置开始丢弃
2019-01-31    1.550905
2019-02-28    0.373627
2019-03-31         NaN
2019-04-30         NaN
Freq: M, dtype: float64
shift重新生成index,value值不变。
ts.shift(2,freq='m')
2019-03-31   -0.320870
2019-04-30   -1.419781
2019-05-31    1.550905
2019-06-30    0.373627
Freq: M, dtype: float64
日期偏移offset

pandas日期偏移可以通过datetime或者Timestamp设置

from pandas.tseries.offsets import Day,MonthEnd
now = datetime(2019,1,1)

now +3*Day()
now+Day(3)
Timestamp('2019-01-04 00:00:00')

now+2*MonthEnd()
now+MonthEnd(2)
Timestamp('2019-02-28 00:00:00')

也可以使用rollback 或者rollforward向前或向后滚动

offset = MonthEnd()
offset.rollback(now)
Timestamp('2018-12-31 00:00:00')
offset.rollforward(now)
Timestamp('2019-01-31 00:00:00')
offset与groupby结合使用
ts = pd.Series(np.random.randn(15),index = pd.date_range(start='20190115',periods=15,freq='4d'))
2019-01-15    2.108529
2019-01-19    0.856846
2019-01-23   -1.493254
...
2019-02-28   -0.592692
2019-03-04    1.733922
2019-03-08   -1.543377
2019-03-12    0.048729
Freq: 4D, dtype: float64

ts.groupby(offset.rollforward).mean()  #等价与ts.resample('M').mean()
2019-01-31    0.813817
2019-02-28   -0.563597
2019-03-31    0.079758
dtype: float64
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值