pd.to_datetime转换有效格式时间列返回NaT,求排查原因
解决pd.to_datetime解析时间字符串返回全NaT的问题
问题原因
你的时间字符串格式为11/05/2022 07:33:57:851 PM,其中秒与毫秒之间用冒号(:)分隔,但你使用的format参数"%m/%d/%Y %I:%M:%S:%f %p"中,%f(用于匹配微秒/毫秒的占位符)在pandas的解析逻辑里,默认期望是点(.)分隔的小数部分,这导致解析器无法匹配格式,最终返回全量NaT。
解决方案
方案1:替换分隔符后指定格式解析
先将时间字符串中秒与毫秒之间的冒号替换为点,再用指定格式解析,既保证效率又确保准确性:
# 精准替换秒后的冒号为点 temp_series['Timestamp[ms]'] = temp_series['Timestamp[ms]'].str.replace(r'(\d{2}):(\d{3})', r'\1.\2', regex=True) # 解析为datetime对象 temp_series['Timestamp[ms]'] = pd.to_datetime(temp_series['Timestamp[ms]'], format="%m/%d/%Y %I:%M:%S.%f %p")
正则表达式r'(\d{2}):(\d{3})'会匹配秒(两位数字)后的冒号和毫秒(三位数字),替换为\1.\2即秒.毫秒的标准格式。
方案2:让pandas自动推断格式
如果数据量较小(你的数据集仅3248行),可以省略format参数,让pandas自动识别时间格式,写法更简洁:
temp_series['Timestamp[ms]'] = pd.to_datetime(temp_series['Timestamp[ms]'], errors='coerce')
注意:自动推断的速度比指定格式慢,适合小数据集场景。
验证结果
执行上述任意方案后,通过temp_series['Timestamp[ms]'].dtype查看列类型,会显示datetime64[ns],且不会出现NaT值。
内容的提问来源于stack exchange,提问作者JotaN92
相关产品推荐
相关产品推荐

