【问题标题】:pandas resample timed events in DataFrame to precise time-binspandas 将 DataFrame 中的定时事件重新采样到精确的时间箱
【发布时间】:2018-06-24 23:40:41
【问题描述】:

也许我找不到它...无论如何,对于 pandas '0.19.2' 有以下内容

问题:

我有一些相关组的定时事件可以通过以下方式生成:

from numpy.random import randint, seed
import pandas as pd

seed(42)    # reproducibility

samp_N = 1000
# create times within 3 hours, and 15 random groups
df = pd.DataFrame({'time': randint(0,3*60*60, samp_N), 
                   'group': randint(0, 15, samp_N)})
# make a resample-able index from the seconds time values
df.set_index(pd.TimedeltaIndex(df.time, 's'), inplace=True)

看起来像:

          group   time
02:01:10     10   7270
00:14:20     13    860
01:29:50      9   5390
01:26:31     13   5191
...

当我尝试对事件重新采样时,我得到了一些不受欢迎的东西

df.resample('5T').count()

          group  time
00:00:04     28    28
00:05:04     18    18
00:10:04     32    32
...

不幸的是,重采样周期从任意(数据中的第一个)偏移值开始。 如果我将其分组(最终需要),那就更烦人了

df.groupby('group').resample('5T').count()

然后我为每个组获得一个新的偏移量 我想要的是采样窗口的精确开始:

00:00:00   5 ...
00:05:00  17 ...
00:10:00  11 ...
...

有一个建议在:https://stackoverflow.com/a/23966229

df.groupby(pd.TimeGrouper('5Min')).count()

但它也不起作用,因为它也破坏了上面所需的分组。

感谢提示!

【问题讨论】:

  • “但它也不起作用,因为它还破坏了上面所需的分组”是什么意思?你最后的审判似乎对我有好处。尽管您可以将其写为df.groupby(pd.Grouper(freq='5Min')).count(),因为TimeGrouper 上有弃用警告
  • df.groupby(['group', pd.Grouper(freq='5Min')]).count() 呢?

标签: python pandas resampling


【解决方案1】:

我不确定这是你想要的结果:

result = df.groupby(['group', pd.Grouper(freq='5Min')]).count().reset_index(level=0)
result.head()
>>>        group  time
00:05:00      0     2
00:10:00      0     1
00:15:00      0     3
00:20:00      0     2
00:30:00      0     1
result.sort_index().head()
>>>       group  time
0 days     10     1
0 days     14     3
0 days      2     1
0 days     13     1
0 days      4     3

【讨论】:

  • 您必须为第 0 组达到 :00 秒。否则我看不出这是如何工作的。至少对我来说不是。获取:组时间 00:00:23 0 1 00:10:23 0 3 00:15:23 0 4 ...
  • 我不确定我是否理解。您能否将random_seed 添加到您的randint 调用中,以便我可以使用与您完全相同的数据框?我还用 pandas 0.22 进行了测试。你需要使用 pandas 0.19 吗?
  • 0.19 不是必需的,只是我的默认 ubuntu 版本,也许这就是问题所在,在以后的 pandas 版本中发生了变化......插入种子和@Prikers 代码我得到:` group time 00:00:04 28 28 00:05:04 18 18 00:10:04 32 32 `
  • 您介意查看@Prikers 种子吗? - 谢谢!
  • 嗯,你是对的,我使用这个种子得到了相同的结果:所有组都有 4 秒...我尝试使用 base (stackoverflow.com/questions/45886936/…) 参数但没有设法获得正确的结果
【解决方案2】:

不幸的是,我没有想出一个好的解决方案,而是一个变通方法。我添加了一个时间值为零的虚拟行,然后按时间和组分组:

df = pd.Series({'time':0,'group':-1}).to_frame().T.set_index(pd.TimedeltaIndex([0], 's')).append(df)
df = df.groupby([pd.Grouper(freq='5Min'), 'group']).count().reset_index('group')
df = df.loc[df['group']!=-1]
df.head()
        group  time
0 days      0     2
0 days      1     4
0 days      2     3
0 days      3     1
0 days      4     2

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 2021-11-08
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2019-01-18
    • 2018-03-14
    相关资源
    最近更新 更多