如何更快且优雅地修正DataFrame中超过24小时的时间列
优化CSV跨午夜时间的处理效率与代码优雅性
最近处理CSV数据时碰到个问题:我读取的文件里有一列EntryTOD(一天中的时间),部分跨午夜的事件时间没有回滚到00:00,而是直接涨到了24点以上(比如24:00:01、25:10:30这类格式),而且这列数据是字符串类型。我需要把小时数≥24的时间减去24小时,转换成正常的0-23小时格式。
最开始我用循环逐行处理:
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:]
代码能跑,但处理8万多行数据居然要30-40秒,实在太慢了。所以想请教两个问题:
- 有没有更快的实现方式?
- 作为Python新手,有没有更优雅的写法?比如能不能用一行代码搞定?
高效优雅的解决方案(感谢Rene)
用Pandas的apply方法配合lambda表达式就能完美解决这两个问题,不仅速度飙升,还能写成一行代码:
f2.EntryTOD = f2.EntryTOD.apply(lambda x: str(int(x.split(':')[0])-24)+x[2:] if int(x.split(':')[0]) > 23 else x)
这个方法的逻辑很清晰:对每个时间字符串,先通过split(':')拆分出小时部分,判断是否大于23(也就是≥24),如果是就把小时数减24,再拼接回原字符串的分钟和秒部分;如果不是就直接保留原时间。相比逐行循环,Pandas的向量化操作能大幅提升处理大数据集的效率,8万行数据基本瞬间就能处理完。
内容的提问来源于stack exchange,提问作者guidout
相关产品推荐
相关产品推荐

