• Pandas数据分析23——pandas时间偏移和周期


     参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》


    pandas的时间对象如下,本次介绍 period和DateOffest类。


     DateOffset时间偏移

    #DateOffset 类似于时间差 Timedelta ,但它使用日历中时间日期的规则,而不是直接进行时间性质的算术计算,让时间更符合实际生活。

    #比如,有些地区使用夏令时时,每日偏移时间有可能是 23 或 24 小时,甚至 25 个小时。

    1. #DateOffset 示例,以下所示了夏令时的情况:
    2. # 生成一个指定的时间,芬兰赫尔辛基时间执行夏令时
    3. ts = pd.Timestamp('2016-10-30 00:00:00', tz='Europe/Helsinki')
    4. ts
    5. # Timestamp('2016-10-30 00:00:00+0300', tz='Europe/Helsinki')
    6. # 增加一天
    7. ts + pd.Timedelta(days=1)
    8. # Timestamp('2016-10-30 23:00:00+0200', tz='Europe/Helsinki')
    9. # 按日历时间
    10. ts + pd.DateOffset(days=1)
    11. # Timestamp('2016-10-31 00:00:00+0200', tz='Europe/Helsinki')

     #以下是增加工作日,出现跨周末的情况:

    1. friday = pd.Timestamp('2022-01-05')
    2. friday.day_name()
    3. #'Friday'
    4. # 增加两个工作日,从周五到周二
    5. two_business_days = 2 * pd.offsets.BDay() #BDay()表示工作日
    6. two_business_days.apply(friday)
    7. # Timestamp('2022-01-09 00:00:00')
    8. friday + two_business_days
    9. # Timestamp('2022-01-09 00:00:00')
    10. (friday + two_business_days).day_name()
    11. # 'Tuesday'

    #所有的日期偏移对象都在 pandas.tseries.offsets 下,其中 pandas.tseries.offsets.DateOffset 是标准的日期范围时间偏移类型,
    #用于日期范围的标准日期增量类型。它默认是一个日历日。

    1. from pandas.tseries.offsets import DateOffset
    2. ts = pd.Timestamp('2017-01-01 09:10:11')
    3. ts + DateOffset(months=3)
    4. # Timestamp('2017-04-01 09:10:11')
    5. ts + DateOffset(hours=2)
    6. # Timestamp('2017-01-01 11:10:11')
    7. ts + DateOffset()
    8. # Timestamp('2017-01-02 09:10:11')

     


    #移动偏移,

    Offset 支持向前或向后偏移:

    1. ts = pd.Timestamp('2020-06-06 00:00:00')
    2. ts.day_name()
    3. # 'Saturday'
    4. # 定义一个工作小时偏移,默认是周一到周五 9-17 点,我们从 10点开始
    5. offset = pd.offsets.BusinessHour(start='10:00')
    6. # 向前偏移一个工作小时,是一个周一,跳过了周日
    7. offset.rollforward(ts)
    8. # Timestamp('2020-06-08 10:00:00')
    9. # 向前偏移至最近的工作日,小时也会增加
    10. ts + offset
    11. # Timestamp('2020-06-08 11:00:00')
    12. # 向后偏移,会在周五下班前的一个小时
    13. offset.rollback(ts)
    14. # Timestamp('2020-06-05 17:00:00')
    15. ts - pd.offsets.Day(1) # 昨日
    16. ts - pd.offsets.Day(2) # 前日
    17. ts - pd.offsets.Week(weekday=0) - pd.offsets.Day(14) # 上周一
    18. ts - pd.offsets.MonthEnd() - pd.offsets.MonthBegin() # 上月一日
    19. #时间偏移操作会保留小时和分钟,有时候我们不在意具体的时间只开始从哪天开始,可以使用 normalize() 进行标准化到午夜 0 点:
    20. offset.rollback(ts).normalize()
    21. # Timestamp('2020-06-05 00:00:00')

    应用偏移

    #apply 可以使用偏移对象应用到一个时间上: 

    1. ts = pd.Timestamp('2020-06-01 09:00')
    2. day = pd.offsets.Day() # 定义偏移对象
    3. day.apply(ts) # 偏移对象应用到时间上
    4. # Timestamp('2020-06-02 09:00:00')
    5. day.apply(ts).normalize() # 标准化/归一化
    6. # Timestamp('2020-06-02 00:00:00')
    7. ts = pd.Timestamp('2020-06-01 22:00')
    8. hour = pd.offsets.Hour()
    9. hour.apply(ts)
    10. # Timestamp('2020-06-01 23:00:00')
    11. hour.apply(ts).normalize()
    12. # Timestamp('2020-06-01 00:00:00')
    13. hour.apply(pd.Timestamp("2014-01-01 23:30")).normalize()
    14. # Timestamp('2014-01-02 00:00:00')

    偏移参数

    #上边我们偏移时只偏移了偏移对象的一个单位,可以传入参数支持多个单位和对象中的其他单位:

    1. d = datetime.datetime(2020, 6, 1, 9, 0)
    2. # datetime.datetime(2020, 6, 1, 9, 0)
    3. d + pd.offsets.Week() # 偏移一周
    4. # Timestamp('2020-06-08 09:00:00')
    5. d + pd.offsets.Week(weekday=4) # 偏移4个周中的日期
    6. # Timestamp('2020-06-05 09:00:00')
    7. # 取一周第几天
    8. (d + pd.offsets.Week(weekday=4)).weekday()
    9. # 4
    10. d - pd.offsets.Week() # 向后一周
    11. # Timestamp('2020-05-25 09:00:00')
    12. #参数也支持归一标准化 normalize:
    13. d + pd.offsets.Week(normalize=True)
    14. # Timestamp('2020-06-08 00:00:00')
    15. d - pd.offsets.Week(normalize=True)
    16. # Timestamp('2020-05-25 00:00:00')
    17. #再比如,YearEnd 支持 month 指定月份:
    18. d + pd.offsets.YearEnd()
    19. # Timestamp('2020-12-31 09:00:00')
    20. d + pd.offsets.YearEnd(month=6)
    21. # Timestamp('2020-06-30 09:00:00')

    序列与时间偏移操作

    1. rng = pd.date_range('2012-01-01', '2012-01-03')
    2. s = pd.Series(rng)
    3. rng
    4. # DatetimeIndex(['2012-01-01', '2012-01-02', '2012-01-03'], dtype='datetime64[ns]', freq='D')
    5. s
    6. '''
    7. 0 2012-01-01
    8. 1 2012-01-02
    9. 2 2012-01-03
    10. dtype: datetime64[ns]
    11. '''
    12. rng + pd.DateOffset(months=2)
    13. # DatetimeIndex(['2012-03-01', '2012-03-02', '2012-03-03'], dtype='datetime64[ns]', freq='D')
    14. s + pd.DateOffset(months=2)
    15. '''
    16. 0 2012-03-01
    17. 1 2012-03-02
    18. 2 2012-03-03
    19. dtype: datetime64[ns]
    20. '''
    21. s - pd.DateOffset(months=2)
    22. '''
    23. 0 2011-11-01
    24. 1 2011-11-02
    25. 2 2011-11-03
    26. dtype: datetime64[ns]
    27. '''

    序列与时长的操作

     #时长也支持与时间偏移进行操作,而且和时长与时长的操作一样:

    1. s - pd.offsets.Day(2)
    2. '''
    3. 0 2011-12-30
    4. 1 2011-12-31
    5. 2 2012-01-01
    6. dtype: datetime64[ns]
    7. '''
    8. td = s - pd.Series(pd.date_range('2011-12-29', '2011-12-31'))
    9. td
    10. '''
    11. 0 3 days
    12. 1 3 days
    13. 2 3 days
    14. dtype: timedelta64[ns]
    15. '''
    16. td + pd.offsets.Minute(15)
    17. '''
    18. 0 3 days 00:15:00
    19. 1 3 days 00:15:00
    20. 2 3 days 00:15:00
    21. dtype: timedelta64[ns]
    22. '''

    时间段

    Period 对象

    1. #创建时间段对象 年
    2. pd.Period('2020')
    3. #季度
    4. pd.Period('2020Q3') #Q代表季度

     Period 对象索引

     #周期 dtype 拥有 freq 属性,并使用频率字符串以诸如 period[D]或period[M]之类的period[freq] 表示。

    1. pi = pd.period_range('2016-01-01', periods=3, freq='M')
    2. pi
    3. # PeriodIndex(['2016-01', '2016-02', '2016-03'], dtype='period[M]', freq='M')
    4. pi.dtype
    5. # period[M]

     #可以使用 period_range 可以构造 Period 序列:

    1. prng = pd.period_range('1/1/2011', '1/1/2012', freq='M')
    2. prng

     

    pd.period_range('2022-11-01 10:00',periods=10,freq='H')

     

    pd.period_range('2022-Q1','2022-Q4',freq='Q-NOV')#NOV为一年最后时间

    pd.period_range('2022-Q1','2022-Q4',freq='Q')


     


    Period 计算操作

    #从周期中添加和减去整数会按其自身的频率移动周期。 具有不同频率(跨度)的Period 之间不允许进行算术运算。

    1. # 一年一个周期
    2. p = pd.Period('2012', freq='A-DEC')
    3. p + 1 # 加一个周期,加一年
    4. # Period('2013', 'A-DEC')
    5. p - 3 # 减少一个周期,减去三年
    6. # Period('2009', 'A-DEC')
    7. # 两月一个周期
    8. p = pd.Period('2012-01', freq='2M')
    9. p + 2 # 加两个周期,到五月据的周期
    10. # Period('2012-05', '2M')
    11. p - 1 # 减去一个周期
    12. # Period('2011-11', '2M')
    13. # 周期频率不同不能计算,会报 IncompatibleFrequency 错误
    14. p == pd.Period('2012-01', freq='3M')

     


    相关类型转化

    1. # 频率从月转为天
    2. pi.astype('period[D]')
    3. # PeriodIndex(['2016-01-31', '2016-02-29', '2016-03-31'], dtype='period[D]', freq='D')
    4. # 转换为 DatetimeIndex
    5. pi.astype('datetime64[ns]')
    6. # DatetimeIndex(['2016-01-01', '2016-02-01', '2016-03-01'], dtype='datetime64[ns]', freq='MS')
    7. # 转换为 PeriodIndex
    8. dti = pd.date_range('2011-01-01', freq='M', periods=3)
    9. dti
    10. # DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31'], dtype='datetime64[ns]', freq='M')
    11. dti.astype('period[M]')
    12. # PeriodIndex(['2011-01', '2011-02', '2011-03'], dtype='period[M]', freq='M')
    pd.date_range('2011-01-01','2022-01-06',freq='D').astype('period[M]')

    pd.date_range('2011-01-01','2022-01-06',freq='D').astype('period[Q]')

     

  • 相关阅读:
    【Spring系列】- Spring事务底层原理
    opencv-python之位平面分解与数字水印
    衡水袁隆平旱稻试验田 国稻种芯·中国水稻节:河北节水增收
    JS-项目实战-更新水果单价更新小计更新总计
    Java项目: 基于SSM实现教务管理系统
    服务供应商安全管理制度
    p5.js map映射
    TSINGSEE青犀基于AI视频识别技术的平安校园安防视频监控方案
    基于HTML语言的环保网站的设计与实现 前后端分离 Java毕业设计·文档报告·代码讲解·安装调试
    PEG/蛋白/抗体功能/修饰/偶联化铋纳米球 PEG/Protein/antibody-Bi nanosphere 的产品介绍
  • 原文地址:https://blog.csdn.net/weixin_46277779/article/details/126307247