首页 > 解决方案 > 将小时数添加到格式化为字符串的时间戳

问题描述

我有一个数据框(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 中做到这一点?

标签: pandasdatetime

解决方案


您可以.applymap()在所选子集的StartEnd列上使用。小时加法可以通过字符串提取和替换来完成。

代码

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)。


推荐阅读