pandas学习-时序数据

本文详细介绍了如何在Python的pandas库中处理时序数据,涵盖了时间点的创建、DateOffset对象、时序属性、以时序作索引、重采样以及窗口函数的使用。通过实例讲解了to_datetime()、date_range()、resample()、rolling()和expanding()等关键函数,还提供了多个练习来巩固学习。
摘要由CSDN通过智能技术生成

学习链接: 第9章 时序数据.

9.1 四类时间变量

名称 描述 元素类型 创建方式
① Date times(时间点/时刻) 描述特定日期或时间点 Timestamp to_datetime或date_range
② Time spans(时间段/时期) 由时间点定义的一段时期 Period Period或period_range
③ Date offsets(相对时间差) 一段时间的相对大小(与夏/冬令时无关) DateOffset DateOffset
④ Time deltas(绝对时间差) 一段时间的绝对大小(与夏/冬令时有关) Timedelta to_timedelta或timedelta_range

9.2 时序的创建

9.2.1Date times 时间点的创建

  • to_datetime()
    ① Pandas在时间点建立的输入格式规定上给了很大的自由度,下面的语句都能正确建立同一时间点

    pd.to_datetime('2020.1.1')
    pd.to_datetime('2020 1.1')
    pd.to_datetime('2020 1 1')
    pd.to_datetime('2020 1-1')
    pd.to_datetime('1-1 2020')
    pd.to_datetime('1-1-2020')
    pd.to_datetime('1/1/2020')
    pd.to_datetime('2020`1`1',format='%Y`%m`%d')		#或者拿format参数强制匹配
    

    ② 使用列表的时候,索引设置为时间点索引

    输入:
    df = pd.DataFrame({
         'year': [2020, 2020],'month': [1, 1], 'day': [1, 2]}, index=pd.to_datetime(['2020/1/1','2020/1/2']))
    输出:
                year  month  day
    2020-01-01  2020      1    1
    2020-01-02  2020      1    2
    

    对于DataFrame而言,如果列已经按照时间顺序排好,则利用to_datetime可自动转换

    输入:pd.to_datetime(df)
    输出:
    2020-01-01   2020-01-01
    2020-01-02   2020-01-02
    dtype: datetime64[ns]
    

    ③ 时间精度与范围限制
    Timestamp的精度远远不止day,可以最小到纳秒ns。

    pd.to_datetime('2020/1/1 00:00:00.123456789')
    

    同时,它带来范围的代价就是只有大约584年的时间点是可用的。

    输入:pd.Timestamp.min
    输出:Timestamp('1677-09-21 00:12:43.145225')
    输入:pd.Timestamp.max
    输出:Timestamp('2262-04-11 23:47:16.854775807')
    
  • date_range()
    start/end/periods(时间点个数)/freq(间隔方法)是该方法最重要的参数,给定了其中的3个,剩下的一个就会被确定。
    其中freq参数有许多选项,常用如下:

    符号 描述
    S
    T 分钟
    H 小时
    D
    B 工作日
    W
    M/Q/Y 月/季/年末
    BM/BQ/BY 月/季/年末最后一个工作日
    BMS/BQS/BYS 月/季/年初首一个工作日
    输入:pd.date_range(start='2020/1/1',periods=3,freq='D')
    输出:DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03'], dtype='datetime64[ns]', freq='D')
    输入:pd.date_range(start='2020/1/1',periods=3,freq='BYS')
    输出:DatetimeIndex(['2020-01-01', '2021-01-01', '2022-01-03'], dtype='datetime64[ns]', freq='BAS-JAN')
    
  • bdate_range()
    它是一个类似与date_range的方法,特点在于可以定制工作日。它的freq中有一个特殊的’C’/‘CBM’/'CBMS’选项,表示定制,需要联合weekmask参数和holidays参数使用。

    weekmask = 'Mon Tue Fri'
    holidays = [pd.Timestamp('2020/1/%s'%i) for i in range(7,13)]
    #工作日周一周二周五,假期7-12日
    pd.bdate_range(start='2020-1-1',end='2020-1-15',freq='C',weekmask=weekmask,holidays=holidays)
    

9.2.2 Dateoffset对象

① DataOffset与Timedelta的区别
Timedelta绝对时间差的特点指无论是冬令时还是夏令时,增减 1day都只计算24小时
DataOffset相对时间差指,无论一天是23\24\25小时,增减1day都与当天相同的时间保持一致

输入:ts = pd.Timestamp('2020-3-29 01:00:00', tz='Europe/Helsinki')
ts + pd.Timedelta(days=1)
ts + pd.DateOffset(days=1)
输出:
#绝对时间差
Timestamp('2020-03-30 02:00:00+0300', tz='Europe/Helsinki')		
#相对时间差
Timestamp('2020-03-30 01:00:00+0300', tz='Europe/Helsinki')

但只要把tz(time zone)去除就可以不用管它了,两者保持一致,除非要使用到时区变换

输入:
ts = pd.Timestamp('2020-3-29 01:00:00')
ts + pd.Timedelta(days=1)
ts + pd.DateOffset(days=1)
输出:
#绝对时间差
Timestamp('2020-03-30 01:00:00')
#相对时间差
Timestamp('2020-03-30 01:00:00')

② 增减一段时间
DateOffset的可选参数包括years/months/weeks/days/hours/minutes/seconds

输入:
pd.Timestamp('2020-01-01') + pd.DateOffset(minutes=20) - pd.DateOffset(weeks=2)
输出:
Timestamp('2019-12-18 00:20:00')

③ 各类常用offset对象

freq 对象
S Second
T Minute
H Hour
D DateOffset
B BDay
W Week
C CDay(定制工作日)
(B)M/(B)Q/(B)Y (B)MonthEnd/(B)QuarterEnd/(B)YearEnd
(B)MS/(B)QS/(B)YS (B)MonthBegin/(B)QuarterBegin/(B)YearBegin
输入:
pd.Timestamp('2020-01-01') + pd.offsets.BQuarterBegin(1)
输出:
Timestamp('2020-03-02 00:00:00')

输入:
pd.Series(pd.offsets.CDay(3,weekmask='Wed Fri',holidays='2020010').apply(i)
                                  for i in pd.date_range('20200105',periods=3,freq='D'))
输出:
0   2020-01-15
1   2020-01-15
2   2020-01-15
dtype: datetime64[ns]

④ 序列的offset操作

#利用apply函数
输入:
pd.Series(pd.offsets.BYearBegin(3).apply(i) for i in pd.date_range('20200101',periods=3,freq='Y'))
输出:
0   2023
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值