400 8949 560

NEWS/新闻

分享你我感悟

您当前位置> 主页 > 新闻 > 技术开发

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

发表时间:2026-01-01 00:00:00

文章作者:碧海醫心

浏览次数:

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

在处理真实业务数据(如 API 返回、日志或数据库导出)时,时间字段常以 ISO 8601 标准格式存储,例如 '2025-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': ['2025-02-06T00:00:00.000Z', '2025-03-17T00:00:00.000Z', 
                      '2025-02-02T00:00:00.000Z', '2025-08-14T00:00:00.000Z'],
    'Out_Date': ['2025-02-08T00:00:00.000Z', '2025-04-27T00:00:00.000Z', 
                 '2025-05-24T00:00:00.000Z', '2025-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)

输出结果:

        ID             Schedule_Date                  Out_Date  days_alert
rank1  089 2025-02-06 00:00:00+00:00 2025-02-08 00:00:00+00:00           2
rank2  983 2025-03-17 00:00:00+00:00 2025-04-27 00:00:00+00:00          41
rank3  037 2025-02-02 00:00:00+00:00 2025-05-24 00:00:00+00:00         112
rank4  654 2025-08-14 00:00:00+00:00 2025-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 时间字符串的首选工具,它简洁、鲁棒、支持时区且完全向量化。牢记“先转换、再计算”的原则,即可高效完成日期差分析任务。

相关案例查看更多