Pandas:将每小时值重新采样为带有偏移量的每月值

ElR*_*udi 5 python datetime pandas pandas-resample

我想将pandas.Series每小时DatetimeIndex到每月的值聚合起来 - 同时考虑到午夜的偏移。

例子

考虑以下跨度约为 1.5 个月的(统一)时间序列。

import pandas as pd
hours = pd.Series(1, pd.date_range('2020-02-23 06:00', freq = 'H', periods=1008))
hours
# 2020-02-23 06:00:00    1
# 2020-02-23 07:00:00    1
#                       ..
# 2020-04-05 04:00:00    1
# 2020-04-05 05:00:00    1
# Freq: H, Length: 1000, dtype: int64
Run Code Online (Sandbox Code Playgroud)

我想将这些总结为几个月,同时考虑到在此用例中这些日子从 06:00 开始。结果应该是:

2020-02-01 06:00:00    168
2020-03-01 06:00:00    744
2020-04-01 06:00:00     96
freq: MS, dtype: int64
Run Code Online (Sandbox Code Playgroud)

我怎么做??


我尝试过的方法以及有效的方法

  • 可以在考虑偏移量的同时使用以下offset参数聚合到天数:

    2020-02-01 06:00:00    168
    2020-03-01 06:00:00    744
    2020-04-01 06:00:00     96
    freq: MS, dtype: int64
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用相同的方法聚合到月份是行不通的。时间戳没有时间部分,并且值不正确

    days = hours.resample('D', offset=pd.Timedelta('06:00:00')).sum()
    days
    # 2020-02-23 06:00:00    24
    # 2020-02-24 06:00:00    24
    # ..
    # 2020-04-03 06:00:00    24
    # 2020-04-04 06:00:00    24  
    # Freq: D, dtype: int64
    
    Run Code Online (Sandbox Code Playgroud)
  • 我可以在聚合数天后将聚合数月作为第二步。在这种情况下,值是正确的,但时间戳中仍然缺少时间部分:

    months = hours.resample('MS', offset=pd.Timedelta('06:00:00')).sum()
    months
    # 2020-02-01    162 # wrong
    # 2020-03-01    744
    # 2020-04-01    102 # wrong
    # Freq: MS, dtype: int64
    
    Run Code Online (Sandbox Code Playgroud)
  • 我当前的解决方法是添加时间增量并手动重置频率。

    days = hours.resample('D', offset=pd.Timedelta('06:00:00')).sum()
    months = days.resample('MS', offset=pd.Timedelta('06:00:00')).sum()
    months
    # 2020-02-01    168
    # 2020-03-01    744
    # 2020-04-01     96
    # Freq: MS, dtype: int64
    
    Run Code Online (Sandbox Code Playgroud)

Hal*_*Ali 1

对您的尝试没有太大改进,但您可以将重采样编写为

months = hours.resample('D', offset='06:00:00').sum().resample('MS').sum()
Run Code Online (Sandbox Code Playgroud)

更改索引标签仍然需要您一直在做的黑客操作,例如手动添加时间增量并设置freqMS

请注意,您可以将时间增量的字符串表示形式传递给偏移量。

需要两次重采样操作的原因是因为当重采样频率大于“D”时,偏移被忽略。使用偏移量执行每日级别的重新采样后,可以在不指定偏移量的情况下进一步对结果进行重新采样。

我相信这是错误的行为,我同意你的观点,这hours.resample('MS', offset='06:00:00').sum()应该会产生预期的结果。

本质上,有两个问题:

  1. 当应用偏移且频率大于“D”时,分档不正确。偏移量被忽略。
  2. 偏移量不会反映在最终输出中,输出会截断到周期的开始或结束。我不确定您所期望的行为是否可以推广到所有用户。

存在影响偏移重采样的相关错误问题我尚未确定这与您面临的问题是否具有相同的根本原因。其根本原因相同。