按连续日期范围对 Pandas DataFrame 进行分组

问题描述 投票:0回答:1

我有一个 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 中实现这种分组?

python pandas dataframe group-by
1个回答
0
投票

代码

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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.