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

14ifxucb  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(120)

bounty将在5天后过期。回答此问题可获得+50的声望奖励。ElRudi希望吸引更多人关注此问题:我在想是否有比我的笨办法更好的办法

我想将一个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

我想把这些加起来,以月为单位**,同时考虑到在这个用例中,天从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

"我该怎么做“
我尝试过的和有效的

  • 我 * 可以 * 使用offset参数在考虑偏移量的情况下汇总到天数:
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
  • 使用相同的方法来汇总到月份是无效的。时间戳记没有时间元件,而且值不正确
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
  • 我可以在聚合到天之后,再聚合到月。在这种情况下,值是正确的,但是时间戳中仍然缺少时间部分:
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
  • 我目前的解决方法是手动添加时间增量并重置频率。
months.index += pd.Timedelta('06:00:00')
months.index.freq = 'MS' 
months
# 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
5sxhfpxr

5sxhfpxr1#

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

months = hours.resample('D', offset='06:00:00').sum().resample('MS').sum()
  • 更改索引标签仍然需要您一直在做的操作,例如手动添加时间增量并将freq设置为MS*
  • 请注意,您可以将时间增量的字符串表示形式传递给offset。*

需要两次重新采样操作的原因是,当重新采样频率大于“D”时,偏移将被忽略。一旦使用偏移执行了每日级别的重新采样,就可以在不指定偏移的情况下对结果进行进一步的重新采样。
我认为这是一种错误的行为,我同意您的观点,即hours.resample('MS', offset='06:00:00').sum()应该产生预期的结果。
本质上,有两个问题:
1.当应用了偏移量且频率大于“D”时,面元划分不正确。偏移量被忽略。
1.偏移量不会反映在最终输出中,输出会截断到周期的开始或结束。我不确定您所期望的行为是否可以推广到所有用户。
有一个相关的bug issue impacting resampling with offsets。我还没有确定它和你面临的问题是否有相同的根本原因。它是相同的根本原因。

zynd9foi

zynd9foi2#

若要将具有每小时DatetimeIndex的panda.Series汇总为每月值,同时考虑午夜的位移,您可以在resample方法中使用offset参数,指定从午夜开始汇总的位移。例如,如果您要从6:00 AM开始汇总,您可以使用pd.Timedelta('06:00:00')的位移。
以下示例说明了如何使用偏移参数将时间序列聚合为月值,同时考虑到午夜的偏移:

import pandas as pd

hours = pd.Series(1, pd.date_range('2020-02-23 06:00', freq = 'H', periods=1008))

# Aggregate the timeseries to monthly values using the offset parameter
months = hours.resample('MS', offset=pd.Timedelta('06:00:00')).sum()

# Print the result
print(months)

这将打印以下内容:

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

相关问题