我一直在使用 AWS S3 存储桶中存在的数据 (csv)。当我提取数据时,我必须将所有列转换为其正确的 dtypes。
除 datetime64 类型外,所有其他 dtypes 都正常工作。 在下面的第一张图片中 - 我正在打印provider_dob,这是所需的格式,datetime64
但是,我稍后在我的代码中打印了dtypes并说它现在是一个对象? 下面是我的代码片段。
我不知道如何合理化这一点,需要第二双眼睛。
你遇到的问题很常见,原因在于
pandas NaT (Not a Time)
的处理方式。虽然
pd.to_datetime()
可以成功地将大部分日期字符串转换为 datetime64 类型,但它会将无法解析的日期字符串(例如空字符串或格式错误的日期)转换为 NaT。
NaT 本身并不是 datetime64 类型,而是 pandas 用来表示缺失时间戳的特殊标记。
当一列同时包含 datetime64 和 NaT 时,pandas 会将整列的数据类型显示为
object
,以便容纳 NaT。
解决方法:
-
数据清洗: 在使用
pd.to_datetime()
之前,先检查并清理数据中的缺失值或格式错误的日期。你可以使用以下方法: -
填充缺失值: 使用
fillna()
方法用特定日期或平均日期填充缺失值。python df['provider_dob'] = pd.to_datetime(df['provider_dob']).fillna(pd.Timestamp('1900-01-01'))
-
删除包含缺失值的行: 使用
dropna()
方法删除包含 NaT 的行。python df.dropna(subset=['provider_dob'], inplace=True)
-
转换错误格式: 使用
errors
参数控制pd.to_datetime()
的行为。errors='coerce'
会将无法解析的日期转换为 NaT,而errors='raise'
会引发错误。python df['provider_dob'] = pd.to_datetime(df['provider_dob'], errors='coerce')
-
数据类型转换: 在清理数据后,如果确认所有日期字符串都已成功转换为 datetime64,可以使用
astype()
方法将整列的数据类型强制转换为 datetime64[ns]。
python
df['provider_dob'] = df['provider_dob'].astype('datetime64[ns]')
总结:
为了避免
pd.to_datetime()
导致数据类型不一致的问题,你需要先清洗数据,处理好缺失值和格式错误的日期,然后再进行类型转换。