我想根据时间差对数据帧行进行分组 数据框
time name day value
2019-02-05 00:22:00 A sun 55
2019-02-05 00:23:24 A sun 56
2019-02-05 00:32:00 A sun 27
2019-02-05 00:35:00 A sun 27
2019-02-05 01:15:00 A sun 29
2019-02-05 23:15:00 A sun 44
2019-02-05 23:59:00,A,sun,44
2019-02-06 00:05:00 A mon 33
2019-02-06 00:25:00 A mon 22
输出
name start end value day
A 2019-02-05 00:22:00 2019-02-05 00:35:00 27 sun
A 2019-02-05 01:15:00 2019-02-05 01:15:00 29 sun
A 2019-02-05 23:15:00 2019-02-05 23:15:00 44 sun
A 2019-02-05 23:59:00 2019-02-05 23:59:00 44 sun
A 2019-02-06 00:05:00 2019-02-06 00:25:00 22 mon
解释
I want to create data frame by grouping the rows if the time difference is <30 mins and minimum value of that group
我该如何实现?
答案 0 :(得分:1)
使用以下代码:
df2 = df.sort_values('time').copy()
rows = [] # Container for output rows
while df2.index.size:
t0 = df2.iloc[0].time # "Start" time
tEnd = t0 + pd.Timedelta('30m') # "End" time
d0 = t0.normalize() # Date part
# Group of source rows: up to the "end" time and same day
grp = df2[(df2.time <= tEnd) & (df2.time.dt.normalize() == d0)]
# Compute the output row (and append)
rows.append([grp.name.iloc[0], grp.time.min(), grp.time.max(),
grp.value.min(), grp.day.iloc[0]])
df2.drop(grp.index, inplace=True) # Delete "processed" rows
# Create result DataFrame
res = pd.DataFrame(rows, columns=['name', 'start', 'end', 'value', 'day'])
由于您希望将每个来源组限制为一天,因此 与我最初的解决方案相比,条件是必要的。 d0 是日期 来自第一行的部分和要选择的行必须在同一天。
结果与您预期的一样。
我认为这里不能使用分组,因为分组的结尾 取决于潜在组中第一行的值。