Pandas读取CSV时解析同列多格式含T的Datetime问题
解决pandas解析同一列多种时间格式的问题
方案一:自定义兼容两种格式的解析函数
写一个能处理两种时间格式的解析函数,通过异常捕获适配不同格式:
import datetime import pandas as pd def parse_datetime(x): # 先尝试解析带秒的格式 try: return datetime.datetime.strptime(x, '%Y-%m-%dT%H:%M:%S') # 失败则尝试不带秒的格式 except ValueError: return datetime.datetime.strptime(x, '%Y-%m-%dT%H:%M') # 读取CSV时指定解析的日期列和自定义解析器 df = pd.read_csv( '你的文件路径.csv', parse_dates=['目标时间列名1', '目标时间列名2'], # 替换成你要解析的多列名称 date_parser=parse_datetime, low_memory=False )
方案二:利用pandas内置的自动识别(pandas 2.0+)
如果你的pandas版本是2.0及以上,可直接使用format='mixed'参数,让pandas自动识别列中的多种时间格式,无需自定义函数:
import pandas as pd # 先读取文件,不提前解析日期 df = pd.read_csv('你的文件路径.csv', low_memory=False) # 对需要解析的列逐一处理 df['目标时间列名1'] = pd.to_datetime(df['目标时间列名1'], format='mixed', errors='coerce') df['目标时间列名2'] = pd.to_datetime(df['目标时间列名2'], format='mixed', errors='coerce')
注:
errors='coerce'会将无法解析的异常值转为NaT,避免因个别脏数据导致整列解析失败。
原问题原因解析
你之前用的lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S')只能匹配带秒的时间格式,当遇到不带秒的2022-01-05T02:24时会抛出异常,进而导致整个列的解析逻辑异常(甚至连符合格式的行也无法正常解析)。通过异常捕获或自动格式识别,就能解决这个问题。
内容的提问来源于stack exchange,提问作者candy
相关产品推荐
相关产品推荐

