我在数据框中有这样的数据。数据范围从2010-01-01到2020年及以后。这些数据是每日制度,但需要转换为每月间隔。数据对应于给定日期范围内的中断(每天有多少物质离线)。要做到这一点,我需要帮助分解月份的终点,以便它们跨越正确的月份然后我将使用重新采样(' M')在pandas中重新采样数据。
我需要帮助转换这些数据:
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')
但这并没有正确处理月份跨越的情况,因为索引只能是一个日期。我不认为有可能有一个索引日期范围。如果没有这么多的转换,也许有一种更简单的方法可以做到这一点?我可能会忽略熊猫的功能。
感谢您的帮助。
答案 0 :(得分:1)
首先,你可能希望持续时间是天数的真正差异,因为在你上面的例子中,它是一个人。您可以使用这样的pandas轻松完成此操作:
df['duration'] = df.end_date - df.start_date
然后你可以像这样麻烦地计算离线总数:
df['offline_total'] = df.duration.apply(lambda x: pd.tslib.Timedelta(x).days) * df.offline_amount_per_day
现在你应该有这样的东西:
duration end_date offline_amount_per_day start_date offline_total
0 13 days 2010-04-16 50.0 2010-04-03 650.0
1 29 days 2011-05-01 50.0 2011-04-02 1450.0
2 23 days 2011-05-01 28.0 2011-04-08 644.0
3 61 days 2010-06-24 620.0 2010-04-24 37820.0
4 9 days 2011-05-16 21.5 2011-05-07 193.5