Groupby'ID'(带时间戳差异)并在Python中维护其他列

2024-06-08 00:57:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从这个部分数据帧中生成六列('ID'、'earlish'、'Latest'、'Difference\u hours'、'Difference\u minutes'、'Serial'):

ID    Timestamp        Serial
A     2019-01-01 00:01    F
A     2019-01-01 00:04    F
A     2019-01-01 00:06    F
B     2019-01-03 12:35    G
B     2019-01-01 13:35    G
.
.
.

部分期望输出为:

ID     Earliest            Latest            Difference_hours  Difference_minutes  Serial
A      2019-01-01 00:01    2019-01-01 00:06        0.083               5             F
A      2019-01-03 12:35    2019-01-04 13:35          1                 60            G
.
.
.

列说明:

“最早”:来自同一“ID”的最早时间戳,
“Latest”:来自同一“ID”的最新版本,
“时间差”:时间戳“最早”和“最晚”之间的时间差,以小时为单位,
'Difference\u minutes':以分钟为单位的'Earliest'和'Latest'之间的时间戳差异

注意:“Serial”对于每个唯一的“ID”都是常量

我知道我需要使用groupby,也许还需要使用transform,但我不知道该怎么做


Tags: 数据版本id时间serial单位latesttimestamp
1条回答
网友
1楼 · 发布于 2024-06-08 00:57:53

这应该起作用:

问题

df = pd.DataFrame({'ID': ['A', 'A', 'A', 'B', 'B'],
          'Timestamp': ['2019-01-01 00:01', '2019-01-01 00:04', 
                        '2019-01-01 00:06', '2019-01-03 12:35', '2019-01-04 13:35'],
          'Serial': ['F', 'F', 'F', 'G', 'G']})
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
print(df)
  ID           Timestamp Serial
0  A 2019-01-01 00:01:00      F
1  A 2019-01-01 00:04:00      F
2  A 2019-01-01 00:06:00      F
3  B 2019-01-03 12:35:00      G
4  B 2019-01-04 13:35:00      G

回答

ans = df.groupby(['ID','Serial'])['Timestamp'].agg(['min','max']).reset_index()
ans['hr_diff'] = ans['max'].dt.hour - ans['min'].dt.hour
ans['min_diff'] = ans['max'].dt.minute - ans['min'].dt.minute

print(ans)
  ID Serial                 min                 max  hr_diff  min_diff
0  A      F 2019-01-01 00:01:00 2019-01-01 00:06:00        0         5
1  B      G 2019-01-03 12:35:00 2019-01-04 13:35:00        1         0

如果您有熊猫>;0.25英寸

ans = df.groupby(['ID','Serial'])['Timestamp'].agg(min='min',
                                                   max='max',
                                                   diff_hr=lambda x: x.max().hour - x.min().hour,
                                                   diff_min=lambda x: x.max().minute - x.min().minute
                                                   )
ans.reset_index()
  ID Serial                 min                 max  diff_hr  diff_min
0  A      F 2019-01-01 00:01:00 2019-01-01 00:06:00        0         5
1  B      G 2019-01-03 12:35:00 2019-01-04 13:35:00        1         0

相关问题 更多 >

    热门问题