将重叠日期范围内的观察结果归为数月

时间:2014-10-21 18:10:13

标签: python pandas

我在数据框中有这样的数据。数据范围从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')

但这并没有正确处理月份跨越的情况,因为索引只能是一个日期。我不认为有可能有一个索引日期范围。如果没有这么多的转换,也许有一种更简单的方法可以做到这一点?我可能会忽略熊猫的功能。

感谢您的帮助。

1 个答案:

答案 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