首页 > 解决方案 > 上采样数据时等分值

问题描述

使用 中的pandasPython,我正在尝试将一些数据从每月值上采样到每日值。有没有办法将一个值平均分配到其产生的“孩子”上?

例如,假设我在一月和二月都开了 100 公里:

In[1]: distPerMonth = pd.Series([100, 100], index=pd.PeriodIndex(['2019-01', '2019-02'], freq='M'))

In[2]: distPerMonth
Out[2]: 
2019-01    100
2019-02    100
Freq: M, dtype: int64

现在我想计算这是每天多少钱,从

In[3]: distPerMonth.resample('D')....

这应该导致

Out[3]:
2019-01-01    3.225806451612903
2019-01-02    3.225806451612903
...
2019-02-27    3.5714285714285716
2019-02-28    3.5714285714285716
Freq: M, dtype: float64

(2 月的值高于 1 月的值,因为我在更少的时间内驾驶了相同的距离。)

我正在寻找一种将“聚合器”函数传递给重采样数据集的方法,其中原始值、原始时间段和“子”时间段可用。

非常感谢!


PS:什么工作是使用这样的自定义功能:

In[3]: distPerMonth.resample('D').apply(custom_function)

因为对于此功能,只有子系列可用(大多数情况下为空)。我想我可以使用这些子系列来推断哪个是父母的时间段,然后使用父系列来获取相应的父值,以某种方式计算有多少个孩子,然后将父值除以这个数字,但这似乎是处理事情的方式过于复杂。


对于那些稍后阅读此问题的人:公认的解决方案适用于无间隙时间序列的情况。如果行之间有间隙,请查看此问题

标签: pythonpandas

解决方案


您可以使用:

m=distPerMonth.resample('D').first()
m.groupby(m.notna().cumsum()).apply(lambda x: x/len(x.index)).ffill()

2019-01-01    3.225806
2019-01-02    3.225806
2019-01-03    3.225806
2019-01-04    3.225806
...
...
2019-02-25    3.571429
2019-02-26    3.571429
2019-02-27    3.571429
2019-02-28    3.571429

推荐阅读