当时间字符串因GMT格式存在差异时,如何将字符串列转为datetime
问题:转换DataFrame中两种格式的时间戳字符串为datetime类型
场景:现有一个Pandas DataFrame,其中某列包含两种不同格式的时间戳字符串,格式定义如下:
fmt = "%a %b %d %H:%M:%S %Z%z %Y" fmt_2 = "%a %b %d %H:%M:%S %Z %Y"
示例时间戳及DataFrame构建代码:
from datetime import datetime import pandas as pd # 示例时间戳 stamp = "Fri Oct 11 15:09:30 GMT+01:00 2019" stamp_2 = 'Sun Oct 27 08:05:47 GMT 2019' stamp_3 = 'Sat Oct 26 08:05:47 GMT 2019' stamp_4 = "Sat Oct 12 15:09:30 GMT+01:00 2019" # 构建示例DataFrame question_dict = {"time":[stamp, stamp_2, stamp_3, stamp_4], "record":[1,2,3,4]} question_df = pd.DataFrame(question_dict)
解决方案
方法1:利用pd.to_datetime的错误处理(推荐,效率更高)
先尝试用第一种格式转换,转换失败的行再用第二种格式处理:
# 定义格式 fmt = "%a %b %d %H:%M:%S %Z%z %Y" fmt_2 = "%a %b %d %H:%M:%S %Z %Y" # 第一步:用fmt转换,失败的设为NaT question_df['datetime'] = pd.to_datetime(question_df['time'], format=fmt, errors='coerce') # 第二步:筛选出未转换成功的行,用fmt_2转换 mask = question_df['datetime'].isna() question_df.loc[mask, 'datetime'] = pd.to_datetime(question_df.loc[mask, 'time'], format=fmt_2, errors='coerce') # 查看结果 print(question_df) print(question_df.info())
方法2:自定义函数结合apply(逻辑直观)
编写一个函数,依次尝试两种格式转换,捕获异常:
def parse_timestamp(s): try: return datetime.strptime(s, fmt) except ValueError: try: return datetime.strptime(s, fmt_2) except ValueError: return pd.NaT # 处理两种格式都不匹配的情况 question_df['datetime'] = question_df['time'].apply(parse_timestamp)
内容的提问来源于stack exchange,提问作者Andrea Ciufo
相关产品推荐
相关产品推荐

