如何在 Python 中将 ISO 8601 时间戳转换为日期并计算日期差值

16次阅读

如何在 Python 中将 ISO 8601 时间戳转换为日期并计算日期差值

本文详解如何使用 pandas 的 `to_datetime()` 将含时区的 iso 格式字符串(如 `’2024-02-06t00:00:00.000z’`)安全转换为 datetime 类型,并准确计算两列日期间的天数差,避免 `typeerror: unsupported operand type(s) for -: ‘str’ and ‘str’`。

在处理真实业务数据(如 API 返回、日志或数据库导出)时,时间字段常以 ISO 8601 标准格式存储,例如 ‘2024-02-06T00:00:00.000Z’。该格式虽人类可读,但在 pandas 中默认被识别为字符串(Object 类型),无法直接参与算术运算——这也是你遇到 TypeError: unsupported operand type(s) for -: ‘str’ and ‘str’ 的根本原因。

正确做法是:先统一转换为 datetime64[ns, UTC] 类型,再执行减法,最后用 .dt.days 提取整数天数差。pd.to_datetime() 是最健壮的解决方案,它能自动识别 Z(表示 UTC 时区)、毫秒精度及 ISO 格式,无需手动指定 format 参数(除非性能极端敏感或格式异常)。

以下为完整可运行示例:

import pandas as pd  # 构造示例数据 data = {     'ID': ['089', '983', '037', '654'],     'Schedule_Date': ['2024-02-06T00:00:00.000Z', '2024-03-17T00:00:00.000Z',                        '2024-02-02T00:00:00.000Z', '2024-08-14T00:00:00.000Z'],     'Out_Date': ['2024-02-08T00:00:00.000Z', '2024-04-27T00:00:00.000Z',                   '2024-05-24T00:00:00.000Z', '2024-02-26T00:00:00.000Z'] } df = pd.DataFrame(data, index=['rank1', 'rank2', 'rank3', 'rank4'])  # ✅ 关键步骤:将字符串列转为 datetime(自动识别 Z 时区) df['Schedule_Date'] = pd.to_datetime(df['Schedule_Date']) df['Out_Date'] = pd.to_datetime(df['Out_Date'])  # ✅ 计算日期差(返回 Timedelta 类型),再提取天数 df['days_alert'] = (df['Out_Date'] - df['Schedule_Date']).dt.days  print(df)

输出结果:

立即学习Python免费学习笔记(深入)”;

ID             Schedule_Date                  Out_Date  days_alert rank1  089 2024-02-06 00:00:00+00:00 2024-02-08 00:00:00+00:00           2 rank2  983 2024-03-17 00:00:00+00:00 2024-04-27 00:00:00+00:00          41 rank3  037 2024-02-02 00:00:00+00:00 2024-05-24 00:00:00+00:00         112 rank4  654 2024-08-14 00:00:00+00:00 2024-02-26 00:00:00+00:00        -170

⚠️ 注意事项与最佳实践

  • 不要用 datetime.strptime() 处理整个 Series:strptime 是单值函数,对 pandas Series 会报错;若坚持使用,需配合 apply(),但性能远低于向量化的 pd.to_datetime()。
  • 时区一致性很重要:Z 表示 UTC,pd.to_datetime() 会自动将其解析为带时区的 datetime64[ns, UTC]。若后续需转换为本地时区,可用 .dt.tz_convert(‘Asia/Shanghai‘)。
  • 处理缺失值(NaN):pd.to_datetime() 默认将无效值转为 NaT(Not a Time),减法结果也为 NaT,.dt.days 会返回 NaN —— 符合预期,无需额外清洗。
  • 性能提示:若数据量极大(千万级),可添加 infer_datetime_format=True 加速解析(但仅适用于标准格式)。

总结:pd.to_datetime() 是处理 ISO 时间字符串的首选工具,它简洁、鲁棒、支持时区且完全向量化。牢记“先转换、再计算”的原则,即可高效完成日期差分析任务。

text=ZqhQzanResources