【问题标题】:Binning in pandas starting from specific date从特定日期开始在熊猫中分箱
【发布时间】:2018-07-11 13:08:22
【问题描述】:

我正在尝试根据日期对值进行分类。数据框看起来像这样

        type     event_date
43851   MEDIUM 2017-10-09 13:28:33
43852     HIGH 2017-10-09 14:19:49
43853     HIGH 2017-10-09 14:23:25
43854     HIGH 2017-10-09 14:24:18
43855   MEDIUM 2017-10-09 14:25:31
43856      LOW 2017-10-09 14:25:33
43857   MEDIUM 2017-10-09 14:25:33
43858      LOW 2017-10-09 14:25:38

我想从特定日期开始分箱,每半小时计算一次 type 的出现次数。我试过了

grouper = df.groupby([pd.Grouper(freq='30T',key='event_date'), 'type'])
grouper['other_col'].count()

这几乎完全符合我的要求

event_date           type
2017-10-09 13:00:00  MEDIUM      1
2017-10-09 14:00:00  HIGH        3
                     LOW         2
                     MEDIUM      2

我愿意

  1. 从指定的小时开始(在我的情况下,它将是第一次出现 LOW - 12 小时 = 02:25:33),而不是向下舍入的第一个可用小时。
  2. 同时显示空白区间

【问题讨论】:

  • 您可以使用 resample 命令显示空区间。例如。 df.resample('hour', on='other_col').sum().fillna(0)

标签: python pandas group-by binning


【解决方案1】:

您可以使用pd.cut

starting_hour = (df[df.type=='LOW'].head(1).event_date - dt.timedelta(hours=12)).item()
intervals = pd.cut(df.event_date, pd.date_range(start=starting_hour , freq='30T', periods=49))

43851    (2017-10-09 13:25:33, 2017-10-09 13:55:33]
43852    (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43853    (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43854    (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43855    (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43856    (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43857    (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43858    (2017-10-09 14:25:33, 2017-10-09 14:55:33]

要仅包含左值,您可以

df['i'] = intervals.transform(lambda k: k.left)

43851   2017-10-09 13:25:33
43852   2017-10-09 13:55:33
43853   2017-10-09 13:55:33
43854   2017-10-09 13:55:33
43855   2017-10-09 13:55:33
43856   2017-10-09 13:55:33
43857   2017-10-09 13:55:33
43858   2017-10-09 14:25:33

然后您可以按间隔分组并使用count()

df.groupby(['i', 'type']).count()

请注意,您使用的是 30 分钟间隔,因此会有很多空行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多