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
2条答案
按热度按时间5sxhfpxr1#
与您的尝试相比没有太大的改进,但是您可以将重采样编写为
freq
设置为MS
*需要两次重新采样操作的原因是,当重新采样频率大于“D”时,偏移将被忽略。一旦使用偏移执行了每日级别的重新采样,就可以在不指定偏移的情况下对结果进行进一步的重新采样。
我认为这是一种错误的行为,我同意您的观点,即
hours.resample('MS', offset='06:00:00').sum()
应该产生预期的结果。本质上,有两个问题:
1.当应用了偏移量且频率大于“D”时,面元划分不正确。偏移量被忽略。
1.偏移量不会反映在最终输出中,输出会截断到周期的开始或结束。我不确定您所期望的行为是否可以推广到所有用户。
有一个相关的bug issue impacting resampling with offsets。我还没有确定它和你面临的问题是否有相同的根本原因。它是相同的根本原因。
zynd9foi2#
若要将具有每小时DatetimeIndex的panda.Series汇总为每月值,同时考虑午夜的位移,您可以在resample方法中使用offset参数,指定从午夜开始汇总的位移。例如,如果您要从6:00 AM开始汇总,您可以使用pd.Timedelta('06:00:00')的位移。
以下示例说明了如何使用偏移参数将时间序列聚合为月值,同时考虑到午夜的偏移:
这将打印以下内容: