
在数据分析和处理中,日期和时间是常见的数据类型。然而,当使用 pandas 的 read_csv 函数从 csv 文件加载数据时,日期时间列有时会被错误地解析为 object 类型(字符串),而非 pandas 期望的 datetime64[ns] 类型。这会阻碍后续的日期时间计算和分析。本教程将深入探讨这一问题,并提供实用的解决方案。
当 CSV 文件中包含日期和时间信息时,我们通常希望 Pandas 能够自动将其识别并转换为 datetime64[ns] 类型。read_csv 函数提供了 parse_dates 参数来辅助这一过程。然而,如果配置不当,即使使用了 parse_dates,相关列仍可能保持 object 类型,导致如下所示的 df.dtypes 输出:
Arrival_Date_Arrival_Time object Arrival_Date/Time object ...
这通常是由于 parse_dates 参数的用法不准确,或者日期时间格式存在歧义。
parse_dates 参数可以接受多种形式,包括列名列表或列索引列表,用于指定哪些列应被解析为日期时间类型。当 CSV 文件中已经存在包含完整日期时间信息的列,或者独立的日期列和时间列需要分别解析时,我们可以直接指定这些列。
考虑以下 CSV 数据示例:
Study ID,Arrival_Date/Time,Arrival_Date,Arrival_Time 2,1/1/2011 0:03,1/1/2011,0:03:00 3,1/1/2011 0:53,1/1/2011,0:53:00
假设我们想将 Arrival_Date/Time 和 Arrival_Date 列解析为日期时间类型。我们可以通过它们的列索引(从0开始计数)来指定:
import pandas as pd
from io import StringIO
csv_text = """
Study ID,Arrival_Date/Time,Arrival_Date,Arrival_Time
2,1/1/2011 0:03,1/1/2011,0:03:00
3,1/1/2011 0:53,1/1/2011,0:53:00"""
# 使用列索引解析日期时间列
df = pd.read_csv(StringIO(csv_text), index_col=['Study ID'], parse_dates=[1, 2])
print("数据类型:")
print(df.dtypes)
print("\n数据内容:")
print(df.head())输出:
数据类型:
Arrival_Date/Time datetime64[ns]
Arrival_Date datetime64[ns]
Arrival_Time object
dtype: object
数据内容:
Arrival_Date/Time Arrival_Date Arrival_Time
Study ID
2 2011-01-01 00:03:00 2011-01-01 0:03:00
3 2011-01-01 00:53:00 2011-01-01 0:53:00从输出可以看出,Arrival_Date/Time 和 Arrival_Date 列已成功被解析为 datetime64[ns] 类型。Arrival_Time 列由于只包含时间信息,默认仍为 object 类型,这在某些情况下是可接受的。
在许多数据集中,日期和时间信息可能存储在两个独立的列中。例如,一个 Arrival_Date 列和一个 Arrival_Time 列。为了方便分析,我们通常需要将它们合并成一个完整的日期时间列。parse_dates 参数同样支持这种操作,通过传递一个包含列名(或索引)列表的列表来实现。
继续使用上述 CSV 数据,我们现在尝试将 Arrival_Date (索引2) 和 Arrival_Time (索引3) 合并成一个新的日期时间列,并同时解析 Arrival_Date/Time (索引1)。
import pandas as pd
from io import StringIO
csv_text = """
Study ID,Arrival_Date/Time,Arrival_Date,Arrival_Time
2,1/1/2011 0:03,1/1/2011,0:03:00
3,1/1/2011 0:53,1/1/2011,0:53:00"""
# 将列索引2和3合并为新的日期时间列,并解析列索引1
df = pd.read_csv(StringIO(csv_text), index_col=['Study ID'], parse_dates=[[2, 3], 1])
print("数据类型:")
print(df.dtypes)
print("\n数据内容:")
print(df.head())输出:
数据类型:
Arrival_Date_Arrival_Time datetime64[ns]
Arrival_Date/Time datetime64[ns]
dtype: object
数据内容:
Arrival_Date_Arrival_Time Arrival_Date/Time
Study ID
2 2011-01-01 00:03:00 2011-01-01 00:03:00
3 2011-01-01 00:53:00 2011-01-01 00:53:00此时,Arrival_Date 和 Arrival_Time 列已被成功合并为一个名为 Arrival_Date_Arrival_Time 的新列,并且其数据类型为 datetime64[ns]。原始的 Arrival_Date 和 Arrival_Time 列将不再存在于 DataFrame 中。同时,Arrival_Date/Time 列也得到了正确的解析。
日期字符串的格式可能存在歧义,例如 "1/1/2011" 既可以解释为 "月/日/年" (MM/DD/YYYY),也可以解释为 "日/月/年" (DD/MM/YYYY)。如果 Pandas 无法确定正确的格式,可能会导致解析错误或将列保留为 object 类型。
为了解决这种歧义,read_csv 提供了 dayfirst 参数。
根据您的数据源的实际日期格式,设置 dayfirst 为 True 或 False 可以确保日期被正确解析。例如,如果您的日期是 DD/MM/YYYY 格式,则应设置为 dayfirst=True。
# 示例:假设日期格式为 DD/MM/YYYY
df_dayfirst = pd.read_csv(StringIO(csv_text), index_col=['Study ID'], parse_dates=[1, 2], dayfirst=True)
print("\n使用 dayfirst=True 解析后的数据类型:")
print(df_dayfirst.dtypes)对于更复杂的或非标准日期时间格式,您还可以使用 format 参数来指定精确的格式字符串,例如 format='%Y-%m-%d %H:%M:%S'。这提供了最精细的控制,但也要求您对数据的格式有准确的了解。
正确解析 CSV 文件中的日期时间数据是数据预处理的关键一步。通过熟练运用 Pandas read_csv 函数的 parse_dates 和 dayfirst 参数,您可以有效地将字符串形式的日期时间转换为 datetime64[ns] 类型,无论是解析单个日期时间列、合并独立的日期和时间列,还是解决日期格式的歧义。遵循本教程中的方法和最佳实践,将帮助您避免常见的解析问题,并为后续的数据分析工作打下坚实的基础。
以上就是Pandas read_csv 日期时间解析:解决object类型与合并列问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号