【问题标题】:Pandas event dataframe (start stop) to regular time series熊猫事件数据框(开始停止)到常规时间序列
【发布时间】:2018-04-09 05:13:11
【问题描述】:

我正在处理一个事件数据集。每行都有一个开始时间、一个结束时间和一个值。

看起来像这样:

df = pd.DataFrame({'start': ['2015-01-05 12:21:00', '2015-01-05 18:01:23', '2015-01-05 23:11:01'], 'end': ['2015-01-05 13:18:45', '2015-01-05 21:03:51', '2015-01-05 12:08:11'], 'value': [3, 4, 5]})

    end start   value
0   2015-01-07 11:18:45 2015-01-07 11:35:00 3
1   2015-01-07 12:08:11 2015-01-07 23:11:01 5
2   2015-01-07 17:03:51 2015-01-07 18:01:23 4

我需要在 10 分钟的常规时间序列中重新采样,如下所示:

    time values
1   2015-01-07 11:01:00  NULL
2   2015-01-07 11:11:00  3
3   2015-01-07 11:21:00  3
4   2015-01-07 11:31:00  3
5   2015-01-07 11:41:00  NULL
...
..  2015-01-07 12:11:00  5
...
..  2015-01-07 17:01:00  5,4
...

处理这种重新采样的最有效方法是什么?我还强调了最后一个值为“5,4”的多个事件的可能性,处理它的最佳方法是什么?

谢谢!

【问题讨论】:

  • 您希望时间从 :01 分钟开始而不是 :00 分钟有什么特别的原因吗?
  • 好问题!谢谢你的提问。重采样是因为我需要与其他数据帧合并。他们大多数是00,少数不是。然而,在这两种情况下,建议都是宝贵的!

标签: python pandas time-series


【解决方案1】:

好吧,如果您最终需要与其他 DataFrames 合并,那么始终假设时间间隔从 :00-:10 开始标准化可能会让您的生活更容易。

在这种情况下,一种可能性是将时间跨度数据帧转换为明确列出每个时间段的数据帧,然后您可以groupby 时间段然后apply(list) 以获得所需的输出。

df['temp_id'] = range(len(df))
df_time = (df[['temp_id', 'start', 'end']].set_index('temp_id').stack()
          .reset_index(level=-1, drop=True).rename('time').to_frame())

df_time = (df_time.groupby('temp_id').apply(lambda x: x.set_index('time')
            .resample('10T').asfreq()).reset_index())
df_time = df_time.merge(df[['value', 'temp_id']]).groupby('time')['value'].apply(list).to_frame()

如果你想包含没有任何内容的索引,你可以重新索引这个数据框。

df_time.reindex(pd.date_range(start=df_time.index.min(),
     end=df_time.index.max(), freq='10T'))

#                    value
#2015-01-07 11:10:00   [3]
#2015-01-07 11:20:00   [3]
#2015-01-07 11:30:00   [3]
#2015-01-07 11:40:00   NaN
#2015-01-07 11:50:00   NaN
#...
#2015-01-07 17:40:00  [4, 5]
#2015-01-07 17:50:00  [4, 5]
#2015-01-07 18:00:00  [4, 5]
#2015-01-07 18:10:00     [4]
#...

【讨论】:

  • 非常感谢您的评论。抱歉,我无法复制。此处出错:df_time = (df_time.groupby('temp_id').apply(lambda x: x.set_index('time') .resample('10T').asfreq()).reset_index()
  • @fparaggio 哦,对不起,我错过了最后的结束 )。我修好了。
  • 谢谢,看到了。但是我仍然无法运行它。同一行五我错误KeyError:'temp_id'。 python/pandas 版本会影响这个吗?我正在一步一步地尝试..
  • 好了,运行顺利! :) 我必须更新熊猫并将时间定义为日期时间。非常感谢你,对我很有教育意义!
  • 嗯,很高兴知道。我在自己的工作中一直在解决一个非常相似的问题。可悲的是,我无法找到将时间跨度转换为重新采样的 date_ranges 的矢量化解决方案,因此在较大的 DataFrame 上肯定需要一段时间。但它似乎是迄今为止我发现的最快的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
相关资源
最近更新 更多