pandas - pandas 列中的开始 - 结束时间

标签 pandas

我有以下问题。我想计算每个 id 出现在 df 中的时间段。

data = {'id': [2, 2, 2, 4, 4], 'time': ['22:17:46', '22:19:02', '22:06:00', '22:18:06', '22:18:06']}
pd.DataFrame.from_dict(data)

在上面的示例中,id 2 的所需输出为 22:19:02 - 22:06:00 = 13.03 分钟. 同样 0 代表 id 4. 最后,我想要的是:

data = {'id': [2, 2, 4, 2, 4], 'time': ['22:17:46', '22:19:02', '22:18:06', '22:06:00', '22:18:06'], 'time_diff': [13.03, 13.03, 0, 13.03, 0]}

我尝试过这个,但在大数据上速度非常慢:

data["max_time"] = data.groupby(["ip_adresa"])["time"].transform("max").astype(str)
data["min_time"] = data.groupby(["ip_adresa"])["time"].transform("min").astype(str)

data["time_diff"] = ""

for i in range(0, len(data)):
    data["diff_time"][i] = (
        datetime.datetime.strptime(data["max_time"][i], format)
        - datetime.datetime.strptime(data["min_time"][i], format)
    ).total_seconds()

请问我该怎么做?

最佳答案

使用变换函数。它迭代 groupby 返回的每一行以查找 id 并查找最小值和最大值。将时间转换为日期时间数据类型

data = {'id': [2, 2, 2, 4, 4], 'time': ['22:17:46', '22:19:02', '22:06:00', '22:18:06', '22:18:06']}
df=pd.DataFrame.from_dict(data)

df['time'] = pd.to_datetime(df['time'])
df['time_diff'] = df.groupby('id')['time'].transform(lambda x: x.max() - x.min())
print(df)

输出

 id                time       time_diff
0   2 2021-11-16 22:17:46 0 days 00:13:02
1   2 2021-11-16 22:19:02 0 days 00:13:02
2   2 2021-11-16 22:06:00 0 days 00:13:02
3   4 2021-11-16 22:18:06 0 days 00:00:00
4   4 2021-11-16 22:18:06 0 days 00:00:00

关于pandas - pandas 列中的开始 - 结束时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69990197/

相关文章:

python - 使用来自另一列的子字符串创建字典键

python - 如何在不跳过 pandas 中的 nan 值的情况下重新采样

python - 带有 bin 计数的 Pandas groupby

python - 使用一列对值进行分组,并使用 pandas 数据框返回另一列中具有最大值的值

python - 将值分配给不同行中的相同名称

python - 从聚合数据集中生成第一个和最后一个测量值之间的差异

python - 检查 pandas 字符串列是否包含多个单词(按任意顺序)

python - 与日期时间索引上的日期/时间进行区间比较(检查一个小时是否在两个时间段之间)

pandas - 将 Pandas DataFrame 转换为类似字节的对象

python - 将存储为字符串的 hashID 列表转换为一列唯一值