Pandas中如何将datetime.time类型转换为datetime.date类型
问题背景
现有名为pomi的pandas DataFrame,样例数据结构如下:
date time sub 2019-09-20 00:00:00 25.0 org
需求为将date列转换为datetime.date类型,最终仅保留YYYY-MM-DD格式的日期内容(如2019-09-20)。
已尝试以下转换代码,均未实现需求:
pomi['date'] = pd.to_datetime(pomi['date']) pomi['just_date'] = pomi['date'].dt.date pomi.date = pd.to_datetime(pomi.date,dayfirst=True) pomi['date'] = pd.to_datetime(pomi["date"].astype(str)).dt.time pomi['date'] = pd.to_datetime(pomi['date']).dt.date pomi['date'] = pd.to_datetime(pomi['date']).dt.normalize()
执行过程中最常触发的报错信息为:TypeError: <class 'datetime.time'> is not convertible to datetime
报错根因
之前执行的代码里有一行pomi['date'] = pd.to_datetime(pomi["date"].astype(str)).dt.time,这行代码会将date列的所有值覆盖为datetime.time类型的纯时间对象,这类对象只存储时分秒信息,不包含年月日属性,后续再调用pd.to_datetime处理该列时,自然会抛出类型无法转换的错误。且一旦执行这行赋值,原始列里的日期信息会被直接覆盖,无法从当前列找回。
可行解决方案
方案1:从源头读取时就指定日期解析(最稳妥)
重新读取原始数据,读取阶段就指定date列的解析规则,避免中途类型错改:
import pandas as pd # 替换为你的实际数据读取逻辑,读入时直接将date列解析为datetime类型 # 如果是csv文件参考如下写法,其他数据源同理指定parse_dates参数即可 pomi = pd.read_csv("你的数据文件路径", parse_dates=['date']) # 直接提取datetime.date类型的日期值 pomi['date'] = pomi['date'].dt.date
方案2:现有DataFrame修复
如果还能拿到未执行过.dt.time那行错误代码的原始DataFrame,跳过错误代码行,直接执行以下转换即可:
# 先将date列统一转为字符串,再解析为datetime类型,异常值标记为NaT pomi['date'] = pd.to_datetime(pomi['date'].astype(str), errors='coerce') # 提取date类型的日期值 pomi['date'] = pomi['date'].dt.date
转换完成后可以执行以下代码验证结果:
# 查看第一个值和对应类型 print(pomi['date'].iloc[0]) # 输出: 2019-09-20 print(type(pomi['date'].iloc[0])) # 输出: <class 'datetime.date'>
注意:转换流程中不要加入
.dt.time的赋值操作,这是触发本次报错的核心错误步骤,会直接丢失列内的日期信息。
内容的提问来源于stack exchange,提问作者John Kennedy
相关产品推荐
相关产品推荐

