Pandas将混合格式字符串日期转为指定datetime并删除含0值行
pandas 混杂格式字符串日期转datetime类型实现方案
场景说明
待处理数据框包含IN、OUT两列时间字段,存在以下特征:
- 日期格式不统一:分隔符混用
/和-,部分时间带超长小数秒、部分仅精确到分钟 - 存在无效值:部分单元格/整行值为
0 - 目标:删除所有包含0值的行,将剩余有效时间统一转换为
'%Y-%m-%d %H:%M:%S'精度的datetime类型
原有代码问题点
- 条件判断语法错误:类似
if '-' and '.' in my_string的写法逻辑不成立,非空字符串会被判定为True,导致分支判断完全失效 - 行过滤逻辑错误:
~(df=='0').all(axis=1)仅会删除两列全为0的行,无法过滤单个字段为0的无效行 - 冗余逻辑过多:手写逐格式判断、手动截断字符串的方式兼容性差,容易在短格式时间上触发索引错误;
pd.to_datetime本身自带混合格式解析能力,不需要额外手写解析函数 - 类型转换反向:自定义函数最后用
strftime把datetime类型转回了字符串,不符合最终要datetime类型的需求
可直接运行的正确代码
import pandas as pd if __name__ == '__main__': # 读取源数据 df = pd.read_excel('data.xlsx') # 过滤所有任意字段为0(兼容字符串0、数值0)的行 df = df[~df.isin(['0', 0]).any(axis=1)].reset_index(drop=True) # 批量转换时间列 time_columns = ['IN', 'OUT'] for col in time_columns: # 自动识别混合格式日期,自动处理超长小数秒 df[col] = pd.to_datetime(df[col], format='mixed', errors='coerce') # 统一截断到秒级,匹配目标精度 df[col] = df[col].dt.floor('s') # 打印结果验证 print("转换后数据:") print(df) print("\n字段类型校验:") print(df.dtypes)
关键参数说明
format='mixed':pandas 2.0+版本支持的参数,允许同列存在多种不同格式的时间字符串,自动匹配解析规则,不需要手动指定格式errors='coerce':遇到无法解析的异常值自动转为空值NaT,避免代码运行中断dt.floor('s'):将时间精度向下取整到秒级,自动丢弃微秒、纳秒部分,和目标格式精度一致- 如果后续需要导出为固定格式的字符串,可额外执行
df[col] = df[col].dt.strftime('%Y-%m-%d %H:%M:%S'),做时间计算时建议保留datetime类型不要转字符串
内容的提问来源于stack exchange,提问作者Sajan Shrestha
相关产品推荐
相关产品推荐

