Python中如何将DataFrame内多格式字符串转换为时分秒格式的time object
嘿,我来帮你搞定这个时间格式统一的问题!看起来你DataFrame里的timeStarted_timeWhenPuzzlesShownOnScreen列混着不同格式的时间字符串,要转成标准的时:分:秒格式甚至time对象对吧?下面是我在处理这类问题时常用的解决方案,用Python+pandas就能轻松实现:
1. 先写一个自定义处理函数
我们可以针对不同的时间格式分支处理,先判断字符串的分隔符数量,再补全成标准格式:
import pandas as pd from datetime import datetime def normalize_time(time_str): # 先处理空值或者非字符串的异常情况 if pd.isna(time_str) or not isinstance(time_str, str): return None parts = time_str.split(':') # 根据分隔符数量判断原格式 if len(parts) == 3: # 已经是HH:MM:SS格式,先校验合法性再返回 try: # 校验格式是否正确 datetime.strptime(time_str, '%H:%M:%S') # 如果要直接转成time对象,就用下面这句替换return time_str # return datetime.strptime(time_str, '%H:%M:%S').time() return time_str except ValueError: return None # 非法格式返回空值 elif len(parts) == 2: # 是MM:SS格式,补上前导的00作为小时 try: datetime.strptime(time_str, '%M:%S') formatted = f'00:{time_str}' # 转time对象的话:return datetime.strptime(formatted, '%H:%M:%S').time() return formatted except ValueError: return None elif len(parts) == 1: # 只有纯秒数,计算转成HH:MM:SS try: total_secs = int(time_str) hours = total_secs // 3600 remaining_secs = total_secs % 3600 minutes = remaining_secs // 60 secs = remaining_secs % 60 formatted = f'{hours:02d}:{minutes:02d}:{secs:02d}' # 转time对象:return datetime.strptime(formatted, '%H:%M:%S').time() return formatted except ValueError: return None else: # 其他异常格式(比如多个冒号),返回空值或者自定义占位符 return None
2. 把函数应用到DataFrame列上
假设你的DataFrame名叫df,直接用apply方法批量处理:
# 生成格式化后的字符串列 df['standardized_time'] = df['timeStarted_timeWhenPuzzlesShownOnScreen'].apply(normalize_time) # 如果要直接得到time对象列,记得把函数里的return改成time对象的那句
额外小提示
- 如果你的数据里还有像
1:2:3这种不带前导零的格式,上面的函数已经通过{hours:02d}这类格式化语法自动补零了,不用额外处理。 - 如果需要处理带毫秒的特殊格式(比如
HH:MM:SS.sss),可以在函数里再加对应的分支,用%H:%M:%S.%f的格式串来校验和转换。
内容的提问来源于stack exchange,提问作者Rebecca Netson
相关产品推荐
相关产品推荐

