Pandas:基于列更改的日期序列数据

c0vxltue  于 2023-05-27  发布在  其他
关注(0)|答案(1)|浏览(124)

我有跨越多天的时间序列数据,我需要对其进行排序(即,每次值更改时创建一列)。我在没有groupby的情况下进行了排序,但我对如何将相同或相似的代码应用于分组数据有点困惑。
我的数据看起来像:

index   timestamp       value
0       1684713605000   1
1       1684713610000   1
2       1684713611000   1
3       1684713614000   0
4       1684713615000   0
5       1684713616000   0
6       1684713619000   1
7       1684713620000   1
8       1684713621000   1
9       1684832896000   1
10      1684832897000   1
11      1684832898000   1
12      1684832901000   0
13      1684832902000   0
14      1684832903000   0
15      1684832906000   1
16      1684832907000   1
17      1684832908000   1

我的timestamp列不能保证是连续的,但通常是一天中每秒一条记录。我需要我想要的sequence列递增直到一天结束,然后在第二天从0开始再次计数。
我用来排序的代码是:

subset = df[["value"]].copy()

subset["change"] = (subset["value"].shift() != subset["value"]) * 1

subset["seq"] = subset["change"].cumsum(axis = 0) - 1

df["seq"] = subset["seq"]

我已经能够创建组与:

subset = df[["timestamp", "value"]].copy()
subset["date"] = pd.to_datetime(subset["timestamp"], unit="ms", origin="unix").dt.date
g = subset.groupby("date")

但我不知道该怎么办。我希望得到的结果是一个序列列,它在每次value更改时递增,但会重置

index   timestamp       value   seq
0       1684713605000   1       0
1       1684713610000   1       0
2       1684713611000   1       0
3       1684713614000   0       1
4       1684713615000   0       1
5       1684713616000   0       1
6       1684713619000   1       2
7       1684713620000   1       2
8       1684713621000   1       2
9       1684832896000   1       0    <-- first record of a new day
10      1684832897000   1       0
11      1684832898000   1       0
12      1684832901000   0       1
13      1684832902000   0       1
14      1684832903000   0       1
15      1684832906000   1       2
16      1684832907000   1       2
17      1684832908000   1       2
smdncfj3

smdncfj31#

尝试:

t = pd.to_datetime(df["timestamp"], unit="ms", origin="unix").dt.date

df["seq"] = df.groupby(t, group_keys=False)["value"].apply(
    lambda x: x.ne(x.shift()).cumsum() - 1
)

print(df)

图纸:

index      timestamp  value  seq
0       0  1684713605000      1    0
1       1  1684713610000      1    0
2       2  1684713611000      1    0
3       3  1684713614000      0    1
4       4  1684713615000      0    1
5       5  1684713616000      0    1
6       6  1684713619000      1    2
7       7  1684713620000      1    2
8       8  1684713621000      1    2
9       9  1684832896000      1    0
10     10  1684832897000      1    0
11     11  1684832898000      1    0
12     12  1684832901000      0    1
13     13  1684832902000      0    1
14     14  1684832903000      0    1
15     15  1684832906000      1    2
16     16  1684832907000      1    2
17     17  1684832908000      1    2

相关问题