熊猫组数据框基于日期时间类型分为不同时期忽略日期部分

时间:2016-09-27 17:18:55

标签: python datetime pandas numpy dataframe

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

说我想每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分钟间隔内,就会对行进行分组,无论日期如何。

2 个答案:

答案 0 :(得分:3)

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

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

enter image description here

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

答案 1 :(得分:1)

由于您不关心date对象的datetime部分,我认为让所有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

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