
在数据处理中,我们经常从外部api或异构数据源获取日期时间字符串。这些字符串的格式可能不完全一致,尤其是在毫秒精度上。例如,iso8601标准格式的日期时间字符串可能出现两种常见变体:
当尝试使用Pandas的pd.to_datetime函数并指定一个严格的格式字符串(如"%Y-%m-%dT%H:%M:%S.%fZ")时,如果遇到不带毫秒的字符串,就会抛出ValueError: time data "..." doesn't match format "%Y-%m-%dT%H:%M:%S.%fZ"。这是因为固定的格式字符串要求所有输入都严格匹配其定义,而.%f部分要求必须存在毫秒。手动填充缺失的毫秒(如.000000)虽然可行,但在处理大量数据时效率低下且容易出错。
为了优雅且高效地解决这一问题,Pandas 2.0及更高版本为pd.to_datetime函数引入了一个强大的format="ISO8601"参数。这个参数专门设计用于解析符合ISO8601标准的各种日期时间字符串格式,包括带或不带毫秒、不同时区表示等。它能够智能识别并处理这些变体,无需用户手动指定复杂的格式字符串或进行预处理。
以下是使用此参数的示例代码:
import pandas as pd
from datetime import timedelta
# 模拟包含不同日期时间格式的DataFrame
df = pd.DataFrame({
"datetime_string": [
"2023-11-24T09:34:18Z",
"2023-11-24T09:35:19.130122Z",
"2023-11-24T10:00:00Z" # 额外添加一个例子
]
})
print("原始DataFrame:")
print(df)
# 使用format="ISO8601"进行转换
df["datetime"] = pd.to_datetime(df["datetime_string"], format="ISO8601")
# 验证转换后的数据类型和内容
print("\n转换后的DataFrame:")
print(df)
print("\n转换后DataFrame的信息:")
df.info()
# 可以继续进行日期时间计算,例如添加60天
df["datetime_plus_60_days"] = df["datetime"] + timedelta(days=60)
print("\n添加60天后的DataFrame:")
print(df)原始DataFrame:
datetime_string
0 2023-11-24T09:34:18Z
1 2023-11-24T09:35:19.130122Z
2 2023-11-24T10:00:00Z
转换后的DataFrame:
datetime_string datetime
0 2023-11-24T09:34:18Z 2023-11-24 09:34:18+00:00
1 2023-11-24T09:35:19.130122Z 2023-11-24 09:35:19.130122+00:00
2 2023-11-24T10:00:00Z 2023-11-24 10:00:00+00:00
转换后DataFrame的信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 datetime_string 3 non-null object
1 datetime 3 non-null datetime64[ns, UTC]
dtypes: datetime64[ns, UTC](1), object(1)
memory usage: 192.0+ bytes
添加60天后的DataFrame:
datetime_string datetime datetime_plus_60_days
0 2023-11-24T09:34:18Z 2023-11-24 09:34:18+00:00 2024-01-23 09:34:18+00:00
1 2023-11-24T09:35:19.130122Z 2023-11-24 09:35:19.130122+00:00 2024-01-23 09:35:19.130122+00:00
2 2023-11-24T10:00:00Z 2023-11-24 10:00:00+00:00 2024-01-23 10:00:00+00:00从结果可以看出,无论原始字符串是否包含毫秒,pd.to_datetime都成功将其解析为datetime64[ns, UTC]类型,并且对于不带毫秒的字符串,它会自动将其毫秒部分视为.000000。
在Pandas中处理来自不同源、包含可选毫秒部分的ISO8601日期时间字符串时,pd.to_datetime函数的format="ISO8601"参数是最佳实践。它不仅能够优雅地解决因格式不匹配导致的ValueError,还能在处理大规模数据时提供卓越的性能和鲁棒性。通过采纳这一方法,您可以显著提高日期时间数据处理的效率和代码的简洁性。务必确保您的Pandas版本符合要求,并注意时区处理等相关细节。
以上就是Pandas高效处理混合格式ISO8601日期时间字符串转换教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号