我想从这个部分数据帧中制作六列('ID'、'最早'、'最新'、'Difference_hours'、'Difference_minutes'、'串行'(:
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">的最早时间戳,
"最新":来自同一"ID"的最新
时间戳,"Difference_hours":"最早"和"最新"之间的时间戳差异(以小时
为单位(,"Difference_minutes":"最早"和"最新"之间的时间戳差异(以分钟为单位(。
注意:"串行"对于每个唯一的"ID"都是恒定的
我知道我需要使用groupby
,也许还有transform
,但不知道如何做到这一点。
这应该有效:
问题
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