pandas - 将小时数添加到格式化为字符串的时间戳
问题描述
我有一个数据框(df),其中员工的开始和结束时间以字符串格式
emp_id|Start|End
001|07:00:00|04:00:00
002|07:30:00|04:30:00
我想在一组员工(而不是所有员工)的开始时间和结束时间增加 2 小时。我通过将主数据帧的一部分放入一个单独的数据帧(df2)来做到这一点。然后我更新这些值,并需要将更新的值合并回主数据框 (df1),在那里我将强制返回一个字符串,因为代码中稍后有一个方法期望这些值是字符串。
我试过这样做:
df1['Start'] = pd.to_datetime(df1.Start)
df1['End'] = pd.to_datetime(df1.End)
df2 = df1.sample(frac=0.1, replace=False, random_state=1) #takes a random 10% slice
df2['Start'] = df2['Start'] + timedelta(hours=2)
df2['End'] = df2['End'] + timedelta(hours=2)
df1.loc[df1.emp_id.isin(df2.emp_id), ['Start, 'End']] = df2[['Start', 'End']]
df1['Start'] = str(df1['Start'])
df1['End'] = str(df1['End']))
我收到 TypeError:不再支持使用 DateTimeArray 对整数和整数数组进行加法/减法。我如何在 Python3 中做到这一点?
解决方案
您可以.applymap()
在所选子集的Start
和End
列上使用。小时加法可以通过字符串提取和替换来完成。
代码
df1 = pd.DataFrame({
"emp_id": ['001', '002'],
"Start": ['07:00:00', '07:30:00'],
"End": ['04:00:00', '04:30:00'],
})
# a subset of employee id
set_id = set(['002'])
# locate the subset
mask = df1["emp_id"].isin(set_id)
# apply hour addition
df1.loc[mask, ["Start", "End"]] = df1.loc[mask, ["Start", "End"]].applymap(lambda el: f"{int(el[:2])+2:02}{el[2:]}")
结果
print(df1)
emp_id Start End
0 001 07:00:00 04:00:00
1 002 09:30:00 06:30:00 <- 2 hrs were added
注意:f 字符串需要 python 3.6+。对于早期版本,将 f-string 替换为
"%02d%s" % (int(el[:2])+2, el[2:])
注意:如果存在,请注意极端情况(时间晚于 22:00)。
推荐阅读
- python - 如何从函数运行导入?
- javascript - 我需要帮助解决错误,未定义的对象会阻止代码运行
- azure-devops - Azure Devops 管道中的 IP 地址可以使用哪些数据类型的参数?
- spring - 如何将锁定设置为在上次更新后几分钟内不更新的记录
- unity3d - 在时间线中播放时音频有破裂的声音
- .net - 通过 .net wrapper 运行 ffmpeg 并将连续文本输出集成到程序中
- android - Wear OS(Samsung Galaxy Watch 4)血压计应用开发
- jenkins - 詹金斯的工作需要太长时间,偶尔
- javascript - 将 html 添加到字符串 svelte
- next.js - NextAuth v4 - JWT_SESSION_ERROR