带UTC标识的时间字符串转换为[hh:mm:ss]格式的方法咨询
错误根因
你遇到的报错来自两个不匹配的场景:
- 原始时间字符串末尾带有
UTC后缀,你最初使用的格式串%Y-%m-%d %H:%M:%S.%f没有匹配该后缀 - 移除UTC后缀后,部分时间字符串不存在微秒段(比如报错中的
2020-01-29 18:30:28仅精确到秒),格式串中的%f强制要求匹配微秒段,因此仍然报错
最优解决方案
推荐直接使用pandas自带的pd.to_datetime()方法,无需手动编写格式串,可自动兼容带UTC标识、带/不带微秒的时间字符串,同时性能远高于列表推导:
import pandas as pd from datetime import timedelta # 转换两列为带时区的datetime类型,自动适配各种格式 df['Date_x'] = pd.to_datetime(df['Date_x'], utc=True) df['Date_y'] = pd.to_datetime(df['Date_y'], utc=True) # 直接完成Date_x + 1小时 < Date_y的比较逻辑 df['compare_result'] = df['Date_x'] + timedelta(hours=1) < df['Date_y']
如果需要将时间转换为仅保留hh:mm:ss的字符串格式,可使用dt属性调用strftime:
df['Date_x_hms'] = df['Date_x'].dt.strftime('%H:%M:%S') df['Date_y_hms'] = df['Date_y'].dt.strftime('%H:%M:%S')
兼容datetime.strptime的方案
如果你坚持要使用datetime库的strptime方法,可通过异常捕获兼容两种格式:
from datetime import datetime as dt def parse_custom_time(time_str): # 移除末尾的UTC后缀 clean_str = time_str.removesuffix(' UTC').strip() try: # 优先匹配带微秒的格式 return dt.strptime(clean_str, '%Y-%m-%d %H:%M:%S.%f') except ValueError: # 匹配失败则尝试不带微秒的格式 return dt.strptime(clean_str, '%Y-%m-%d %H:%M:%S') df['Date_x'] = df['Date_x'].apply(parse_custom_time) df['Date_y'] = df['Date_y'].apply(parse_custom_time)
内容的提问来源于stack exchange,提问作者Oscar Dyremyhr
相关产品推荐
相关产品推荐

