Pandas -按日期条件分组行

6l7fqoea  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(138)

我有下面的dataframe…

date_time  day  value1  value2
0  2023-03-15 00:00:00    3       1       1
1  2023-03-15 06:00:00    3       2       2
2  2023-03-15 12:00:00    3       3       3
3  2023-03-15 18:00:00    3       4       4
4  2023-03-16 00:00:00    4       5       5
5  2023-03-16 06:00:00    4       6       6
6  2023-03-16 12:00:00    4       7       7
7  2023-03-16 18:00:00    4       8       8
8  2023-03-17 00:00:00    5       9       9
9  2023-03-17 06:00:00    5      10      10
10 2023-03-17 12:00:00    5      11      11
11 2023-03-17 18:00:00    5      12      12
12 2023-03-20 06:00:00    1      13      13

我正在尝试按天对数据进行分组,偏移7小时。使用以下...

rows = df.resample('24H', on='date_time', origin='epoch', offset='7H').agg({
    'date_time': 'last', 'day': 'last', 'value1': 'first', 'value2': 'last'})

这给了我...

date_time  day  value1  value2
date_time                                                   
2023-03-14 07:00:00 2023-03-15 06:00:00  3.0     1.0     2.0
2023-03-15 07:00:00 2023-03-16 06:00:00  4.0     3.0     6.0
2023-03-16 07:00:00 2023-03-17 06:00:00  5.0     7.0    10.0
2023-03-17 07:00:00 2023-03-17 18:00:00  5.0    11.0    12.0
2023-03-19 07:00:00 2023-03-20 06:00:00  1.0    13.0    13.0

这几乎是正确的,但我还希望将任何间隔超过24小时的数据分组到一行中,就像这样......

date_time  day  value1  value2
date_time                                                   
2023-03-14 07:00:00 2023-03-15 06:00:00  3.0     1.0     2.0
2023-03-15 07:00:00 2023-03-16 06:00:00  4.0     3.0     6.0
2023-03-16 07:00:00 2023-03-17 06:00:00  5.0     7.0    10.0
2023-03-19 07:00:00 2023-03-20 06:00:00  1.0    11.0    13.0

在我重新采样数据后,我尝试对重新采样的数据进行分组,使用…

rows = rows.groupby(((rows.date_time - rows.date_time.shift(-1)) < '-24H').cumsum()
       ).agg({'date_time': 'last', 'day': 'last', 'value1': 'first', 'value2': 'last'})

但这导致了

date_time  day  value1  value2
date_time                                         
0         2023-03-17 06:00:00  5.0     1.0    10.0
1         2023-03-20 06:00:00  1.0    11.0    13.0

因此,简而言之,我希望重采样的前3行和分组的最后一行实现我的目标。
我很接近了,但还不太明白。
有没有办法做到我所追求的?

ahy6op9u

ahy6op9u1#

这本质上是一个缺口和孤岛问题:当差值为1天或更少时,创建一个新岛屿。

agg_dict = {
    "date_time": "last",
    "day": "last",
    "value1": "first",
    "value2": "last",
}
rows = df.resample("24H", on="date_time", offset="7H").agg(agg_dict).dropna()

island = rows.index.to_series().diff().le("1D").cumsum().rename("island")
rows = rows.groupby(island).agg(agg_dict)

相关问题