【问题标题】:pandas create group ID on a five 5 minutes basepandas 以 5 分钟为基础创建组 ID
【发布时间】:2019-05-02 03:03:56
【问题描述】:

我有一个如下的数据框:

s = pd.DataFrame({
    'X':np.arange(2, 10),
    'time':pd.to_datetime([
        '20130101 7:34:04', '20130101 8:34:08', '20130101 10:34:08',
        '20130101 12:34:15', '20130101 13:34:28', '20130101 12:34:54',
        '20130101 14:34:55', '20130101 17:29:12'])
})

我想每小时或任何想要的时间间隔为time 列创建一个组 ID。我们以每小时为例,下面是我想要的(从午夜 00:00:00 开始):

X                time  time-group
0  2 2013-01-01 07:34:04           7
1  3 2013-01-01 08:34:08           8
2  4 2013-01-01 10:34:08          10
3  5 2013-01-01 12:34:15          12
4  6 2013-01-01 13:34:28          13
5  7 2013-01-01 12:34:54          12
6  8 2013-01-01 14:34:55          14
7  9 2013-01-01 17:29:12          17

如何有效地做到这一点?

P.S.我知道在这种特殊情况下,我可以将s.time.dt.hour 用作time-group,但我想要一个适用于任何时间间隔的通用解决方案。

【问题讨论】:

  • 您需要创建一个新列还是只是想对组进行分组并执行一些聚合?
  • .dt.floor() 适用于大多数任意时间段。或pd.cut
  • @Chris,我需要创建一个新列。这里的解决方案对我不起作用stackoverflow.com/questions/23966152/…
  • @JasonGoal 我相信 TimeGrouper 已更改为 pd.Group() 你尝试了吗s.groupby(pd.Grouper(key='time', freq='H'))['X'].sum()
  • 我试过了,但这仍然不能给我一个新的组 ID 列

标签: pandas datetime pandas-groupby


【解决方案1】:

在 Chris 的大力帮助下,我们找到了解决这个问题的方法,基本与 enter link description here 相同,但稍作修改以从想要的基础开始,这里的技巧是添加基础(起点)作为一个人的第一行data.frame 这是代码;

s = pd.DataFrame({
    'X':np.arange(1,10),
    'time':pd.to_datetime([
        '20130101 00:00:00',
        '20130101 7:34:04', '20130101 8:34:08', '20130101 10:34:08',
        '20130101 12:34:15', '20130101 13:34:28', '20130101 12:34:54',
        '20130101 14:34:55', '20130101 17:29:12']),
    'time-group':[1,7,8,10,12,13,12,14,17]
})
# '20130101 00:00:00' is the base I want, you can change it to whatever you want.
s.sort_values(['time'], ascending=[True],inplace=True)
new = s.groupby(pd.Grouper(key='time', freq='15T'), as_index=False).apply(lambda x: x['time'])
s['time-group'] = new.index.get_level_values(0)

这会给你:

   X                time  time-group
0  1 2013-01-01 00:00:00           0
1  2 2013-01-01 07:34:04          30
2  3 2013-01-01 08:34:08          34
3  4 2013-01-01 10:34:08          42
4  5 2013-01-01 12:34:15          50
5  6 2013-01-01 13:34:28          50
6  7 2013-01-01 12:34:54          54
7  8 2013-01-01 14:34:55          58
8  9 2013-01-01 17:29:12          69

【讨论】:

  • 一个更正...您需要在级别(1)上排序,然后才能获得 0...new.sort_index(level=1).index.get_level_values(0) 的级别值,这就是索引 5 和 6 不正确的原因。您的时间列未在分组之前排序。
猜你喜欢
  • 2020-12-14
  • 2021-08-02
  • 2016-08-09
  • 2013-12-30
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多