我有一个 Pandas DataFrame,如下所示:
import pandas as pd
data = {
'date': ['2023-01-01 00:00:00', '2023-01-01 06:00:00', '2023-01-01 12:00:00',
'2023-01-02 00:00:00', '2023-01-02 06:00:00', '2023-01-03 00:00:00'],
'x': [1, 1, 1, 2, 2, 1],
'y': ['A', 'A', 'A', 'B', 'B', 'A'],
'z': [10, 10, 10, 20, 20, 10]
}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
print(df)
DataFrame 包含以下列:
date
:时间戳x
、y
、z
:分组标识符我想根据列
x
、y
和 z
中的值对行进行分组。此外,我想为连续行之间的 date
差异不超过 6 小时 (6H
) 的行创建组。目标是为每个组获取具有匹配的 x
、y
、z
值的日期范围,这些值在 6 小时间隔内连续间隔。
这是所需输出的图示:
x | y | z | 日期范围 |
---|---|---|---|
1 | A | 10 | 2023-01-01 00:00:00 至 2023-01-01 12:00:00 |
2 | B | 20 | 2023-01-02 00:00:00 至 2023-01-02 06:00:00 |
1 | A | 10 | 2023-01-03 00:00:00 至 2023-01-03 00:00:00 |
我尝试过使用带有自定义聚合函数的 groupby 以及 merge_asof 来解决 6 小时的间隙,但这两种方法都无法按预期创建正确的分组。
如何在 Pandas 中实现这种分组?
代码
grp = df.groupby(['x', 'y', 'z'])['date'].diff().gt('6H').cumsum()
tmp = df.groupby(
['x', 'y', 'z', grp], sort=False
)['date'].agg(['first', 'last']).droplevel(-1)
fmt = '%Y-%m-%d %H:%M:%S'
out = tmp['first'].dt.strftime(fmt).str.cat(
tmp['last'].dt.strftime(fmt), sep=' to '
).reset_index(name='date_range')
输出:
x y z date_range
0 1 A 10 2023-01-01 00:00:00 to 2023-01-01 12:00:00
1 2 B 20 2023-01-02 00:00:00 to 2023-01-02 06:00:00
2 1 A 10 2023-01-03 00:00:00 to 2023-01-03 00:00:00