我想根据可变的时间间隔将行分组。 但是,在进行分组时,我想忽略日期部分,只根据时间日期分组。
说我想每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分钟间隔内,就会对行进行分组,无论日期如何。
答案 0 :(得分:3)
这假设您将一天分成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
答案 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
希望这个技巧可能适合您的需要。谢谢!