【问题标题】:Panda group dataframe based on datetime type into different period ignoring date part熊猫根据日期时间类型将数据框分组到不同时期,忽略日期部分
【发布时间】:2017-02-05 10:39:27
【问题描述】:

我想根据可变的时间间隔将行分组。 但是,在进行分组时,我想忽略日期部分,只根据时间日期分组。

假设我想每 5 分钟分组一次。

       timestampe            val
0  2016-08-11 11:03:00        0.1
1  2016-08-13 11:06:00        0.3
2  2016-08-09 11:04:00        0.5
3  2016-08-05 11:35:00        0.7
4  2016-08-19 11:09:00        0.8
5  2016-08-21 12:37:00        0.9

        into 

       timestampe             val
0  2016-08-11 11:03:00        0.1
2  2016-08-09 11:04:00        0.5

       timestampe             val
1  2016-08-13 11:06:00        0.3
4  2016-08-19 11:09:00        0.8

       timestampe             val
3  2016-08-05 11:35:00        0.7
       timestampe             val
5  2016-08-21 12:37:00        0.9

请注意,只要时间在相同的 5 分钟间隔内,就会对行进行分组,无论日期如何。

【问题讨论】:

  • 我试过 TimeGrouper,它考虑了日期。还尝试创建一个只有时间分区的附加列,但不知何故不允许我再使用 TimeGrouper。
  • 有未回答的问题。您希望 5 分钟间隔从第一次观察开始吗?意思是,第一次观察是 11:03,获取所有行到 11:08 的时间。如果是这样,假设您选择了 11:03,然后是 11:45,然后是 11:07。是否要将 11:03 和 11:07 分组,然后下一组从 11:45 开始?或者,您想先按时间排序?如果这是真的,那么第一行的时间是任意的。或者,您是否满足于将一天分成 5 分钟的时段?
  • @piRSquared 将一天分成 5 分钟的窗口。

标签: python datetime pandas numpy dataframe


【解决方案1】:

这是假设您将一天分成 5 分钟的窗口

df.groupby(df.timestampe.dt.hour.mul(60) \
             .add(df.timestampe.dt.minute) // 5) \
  .apply(pd.DataFrame.reset_index)


for name, group in df.groupby(df.timestampe.dt.hour.mul(60).add(df.timestampe.dt.minute) // 5):
    print name
    print group
    print

132
           timestampe  val
0 2016-08-11 11:03:00  0.1
2 2016-08-09 11:04:00  0.5

133
           timestampe  val
1 2016-08-13 11:06:00  0.3
4 2016-08-19 11:09:00  0.8

139
           timestampe  val
3 2016-08-05 11:35:00  0.7

151
           timestampe  val
5 2016-08-21 12:37:00  0.9

【讨论】:

  • 对不起,我没有说清楚。因此 5 分钟窗口不应仅适用于 1 小时范围。 11:35 但 12:37 应该在不同的窗口中。您的解决方案只占很小的一部分。
  • @9blue 固定帖子。
【解决方案2】:

由于您不关心datetime 对象的date 部分,我认为使所有date 相等是一个好技巧。

df['time'] = df['timestamp'].apply(lambda x: x.replace(year=2000, month=1, day=1))

你得到:

            timestamp  val                time
0 2016-08-11 11:03:00  0.1 2000-01-01 11:03:00
1 2016-08-13 11:06:00  0.3 2000-01-01 11:06:00
2 2016-08-09 11:04:00  0.5 2000-01-01 11:04:00
3 2016-08-05 11:35:00  0.7 2000-01-01 11:35:00
4 2016-08-19 11:09:00  0.8 2000-01-01 11:09:00
5 2016-08-21 11:37:00  0.9 2000-01-01 11:37:00

现在你可以在time 列上做你想做的事。例如,每 5 分钟分组一次:

grouped = df.groupby(Grouper(key='time', freq='5min'))

grouped.count()

                     timestamp  val
time                               
2000-01-01 11:00:00          2    2
2000-01-01 11:05:00          2    2
2000-01-01 11:10:00          0    0
2000-01-01 11:15:00          0    0
2000-01-01 11:20:00          0    0
2000-01-01 11:25:00          0    0
2000-01-01 11:30:00          0    0
2000-01-01 11:35:00          2    2

希望这个技巧可能适合您的需要。谢谢!

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    相关资源
    最近更新 更多