贝利信息

如何在 Python 中解析 ISO 8601 时间戳并计算日期差值

日期:2026-01-01 00:00 / 作者:聖光之護

本文详解如何将形如 `2025-02-06t00:00:00.000z` 的 iso 8601 格式字符串安全转换为带时区的 datetime 类型,并准确计算两列日期间的天数差。核心在于使用 `pd.to_datetime()` 自动识别 zulu 时区(utc),避免手动解析错误。

在处理真实业务数据(如 API 响应、日志或数据库导出)时,常遇到以 yyyy-mm-ddTHH:MM:SS.sssZ 格式存储的 UTC 时间戳(即 ISO 8601 标准的 Zulu 时间)。这类字段在 Pandas 中默认为 object 类型(本质是字符串),无法直接进行减法运算——这正是你遇到 TypeError: unsupported operand type(s) for -: 'str' and 'str' 的根本原因。

✅ 正确做法:使用 pd.to_datetime() 进行智能类型转换
Pandas 的 to_datetime() 函数能自动识别 Z 后缀,并将其解析为带 +00:00 时区信息的 datetime64[ns, UTC] 类型,无需手动指定格式字符串(如 %Y-%m-%dT%H:%M:%S.%fZ),大幅提升鲁棒性与可维护性。

以下是完整、可运行的解决方案:

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 为 UTC)
df['Schedule_Date'] = pd.to_datetime(df['Schedule_Date'])
df['Out_Date'] = pd.to_datetime(df['Out_Date'])

# ✅ 计算日期差(结果为 Timedelta,提取 .dt.days 获取整数天数)
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

? 注意事项与最佳实践:

掌握 pd.to_datetime() 这一“瑞士军刀”,即可高效、可靠地处理绝大多数现实场景中的时间解析与计算任务。