【问题标题】:Attributing oberservations in overlapping date ranges to months将重叠日期范围内的观察归因于月份
【发布时间】: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”。这些应该是累积的还是平均的?

标签: python pandas


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多