gpt4 book ai didi

python - 将每个第一个匹配行中的列值设置为 0

转载 作者:行者123 更新时间:2023-12-01 06:29:26 24 4
gpt4 key购买 nike

我正在尝试检测时间戳之间的差异低于某个阈值的时间序列。为了执行此操作,我将时间戳列表转换为秒,并测量每个时间戳之间的差异。我已经编写了代码来执行此操作,但问题是当我测量日期之间的差异时,每天第一行的时间差值应该为零。因此下面数据帧中的值 86390 应该为 0。这只是一个人为的示例。对于多个组,如何将每个组中的第一个条目设置为 0?

代码:

import pandas as pd

arr= []
df = pd.DataFrame(
{'date': ['2019-01-01 00:02:48.714000' , '2019-01-01 00:02:58.714000' , '2019-01-02 00:02:48.714000' , '2019-01-02 00:04:48.714000'],
'id': [1 , 2 , 3 , 4],

})
df['date'] = pd.to_datetime(df['date'])

for d in df['date'] :
arr.append(d.timestamp())

df.sort_values(by=['date'])
df['TIME_IN_SEC'] = arr
df['TIME_IN_SEC_SHIFT'] = df.TIME_IN_SEC.shift(1)
df['TIME_DIFF'] = df["TIME_IN_SEC"] - df["TIME_IN_SEC_SHIFT"]

list_values = []

for g in df.groupby(pd.Grouper(key='date',freq='D')) :
list_values.append(sum(g[1]['TIME_DIFF']) / len(g[1]))

df

渲染:

enter image description here

最佳答案

要将每天的第一行设置为零,您可以按日期列进行分组,但提取实际日期值,然后聚合到“第一”行。以此为“id”列创建一个系列。 (我假设它们是独特的值。)

id_filt = df.groupby(df.date.dt.date).first()['id']

然后使用 loc 仅返回具有“id”值的行,然后将列设置为零。

df.loc[df["id"].isin(id_filt.values), ["TIME_IN_SEC_SHIFT", "TIME_DIFF"]] = 0

date id TIME_IN_SEC TIME_IN_SEC_SHIFT TIME_DIFF
0 2019-01-01 00:02:48.714 1 1.546301e+09 0.000000e+00 0.0
1 2019-01-01 00:02:58.714 2 1.546301e+09 1.546301e+09 10.0
2 2019-01-02 00:02:48.714 3 1.546387e+09 0.000000e+00 0.0
3 2019-01-02 00:04:48.714 4 1.546387e+09 1.546387e+09 120.0

当然你可以将它们组合在一起得到:

df.loc[
df["id"].isin(df.groupby(df.date.dt.date).first()["id"].values),
["TIME_IN_SEC_SHIFT", "TIME_DIFF"],
] = 0

关于python - 将每个第一个匹配行中的列值设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59975706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com