【发布时间】:2014-12-17 01:42:49
【问题描述】:
我在数据框中有这样的数据。数据范围从 2010-01-01 到 2020 年及以后。该数据是按日计算的,但需要转换为每月间隔。数据对应于给定日期范围内的中断(每天有多少物质离线)。为此,我需要帮助分解月份的终点,以便它们跨越正确的月份,然后我将在 pandas 中使用 resample('M') 重新采样数据。
我需要帮助转换这些数据:
df = pd.DataFrame({
'start_date': [datetime(2010,4,3),datetime(2011,4,2), datetime(2011,4,8), datetime(2010,4,24), datetime(2011,5,7)],
'end_date': [datetime(2010,4,16), datetime(2011,5,1), datetime(2011,5,1), datetime(2010,6,24), datetime(2011,5,16)],
'duration': [14,30,24,62,10],
'offline_amount_per_day': [50.0, 50.0, 28.0, 620.0, 21.5]})
start_date end_date duration offline_amount_per_day
0 2010-04-03 2010-04-16 14 50.000000
1 2011-04-02 2011-05-01 30 50.000000
2 2011-04-08 2011-05-01 24 28.000000
3 2010-04-24 2010-06-24 62 620.000000
4 2011-05-07 2011-05-16 10 21.500000
...
进入这个:
start_date end_date duration offline_amount offline_total
0 2010-04-03 2010-04-16 14 50.000000 700
1 2011-04-02 2011-04-30 29 50.000000 1450
2 2011-05-01 2011-05-01 1 50.000000 50
3 2011-04-08 2011-04-30 23 28.000000 644
4 2011-05-01 2011-05-01 1 28.000000 28
5 2010-04-24 2010-04-30 7 620.000000 4340
6 2010-05-01 2010-05-31 31 620.000000 19220
7 2010-06-01 2010-06-24 24 620.000000 14880
8 2011-05-07 2011-05-16 10 21.500000 215
在此之后,我的计划是使用 df.resample('M') 通过在“start_date”和“offline_total”列上重新采样来重新采样数据,这样我就可以准确了解这种物质有多少是离线的一个月。我想将其重新采样到从 2010-01 到数据集末尾的所有月份,丢弃任何不符合此范围的数据,并在没有原始每日数据的月份填充 0。
最后它应该看起来像这样,其中 offline_total 对应于应该存在的适当整数:
month offline_total
0 2010-01 ...
1 2010-02 ...
2 2010-03 ...
...
3 2014-09 ...
4 2014-10 ...
最初我尝试做的事情如下:
duration_offline = duration_offline.set_index('start_date')
duration_offline = df.resample('M')
但这并不能正确处理跨越月份的情况,因为索引只能是一个日期。我认为不可能有一个索引日期范围。也许有一种更简单的方法可以在没有这么多转换的情况下做到这一点?我可能忽略了熊猫功能。
感谢您的帮助。
【问题讨论】:
-
您的数据实际上是什么意思?在同一时间跨度内(您的数据框中的索引 2 和 3)有些东西离线“50”和“28”。这些应该是累积的还是平均的?