我正在读取包含许多列的csv文件,其中之一是TOD(一天中的时间)。某些事件会在午夜之前结束,而不是回滚到00:00的时间只会持续增加到24:00以后。例如23:59:50、24:00:01、24:00:10,...) EntryTOD被解析为字符串。
我想应用一个简单的逻辑,即时间大于24,只需减去24小时即可。这是我的代码:
for row in f2.itertuples():
# Fix times > 24h
if int(row.EntryTOD[0:2]) >= 24:
actualTime = int(row.EntryTOD[0:2]) - 24
f2.EntryTOD[row.Index-1] = str(actualTime) + row.EntryTOD[2:]
此代码有效,但对于80k +行来说有点慢。运行大约需要30-40秒。
我的问题是:
1)有更快的方法吗?
2)另外,由于我对Python不太了解,还有没有更优雅的方法?它可能仍涉及遍历整个专栏,但我感觉可以用一行代码完成
先谢谢您
Guido
解决方案: 感谢Rene:
f2.EntryTOD = f2.EntryTOD.apply(lambda x: str(int(x.split(':')[0])-24)+x[2:] if int(x.split(':')[0]) > 23 else x)
这是非常快的单线!
答案 0 :(得分:1)
我认为这就是您想要的:
# Sample df
data = [
['25:22:22', 1, 5],
['01:01:01', 36, 2]
]
cols = ['EntryTOD', 'two', 'three']
df = pd.DataFrame(data, columns = cols)
df
EntryTOD two three
0 25:22:22 1 5
1 01:01:01 36 2
解决方案:
df['hour'] = (df['EntryTOD'].str[0:2]).astype(int)
df.loc[
df.hour >= 24, 'hour'
] = df.loc[df.hour >= 24, 'hour'] - 24
# Edit EntryTOD variable
for i in range(df.shape[0]):
df.EntryTOD.iloc[i] = df.EntryTOD.iloc[i].replace(
df['EntryTOD'].str[0:2].iloc[i], '0'+df['hour'].astype(str).iloc[i]
)
输出:
EntryTOD two three hour
0 01:22:22 1 5 1
1 01:01:01 36 2 1
答案 1 :(得分:1)
您可以尝试:
f2 = pd.DataFrame(['23:59', '23:59:59', '24:00', '24:01', '25:25:25'], columns=['TOD'])
f2.TOD.apply(lambda x: f"{int(x.split(':')[0])-24}:{x.split(':')[1]}" if int(x.split(':')[0]) > 23 else x)
结果:
0 23:59
1 23:59:59
2 0:00
3 0:01
4 1:25
Name: TOD, dtype: object