Pandas date列转object后apply返回Timestamp及去除00:00:00问题
问题解答
疑问1:已将date列转为object类型,为什么自定义函数接收的参数还是Timestamp类型?
你调用astype("object")仅会修改列的容器存储类型为object,并不会改变列中每个元素本身的类型,原datetime类型的元素本质还是pandas._libs.tslibs.timestamps.Timestamp对象,只是被放在了object类型的列容器中。
疑问2:为什么处理后date列类型自动变回datetime64[ns]?
pandas对列赋值时会自动推断最适配的存储类型,你的自定义函数原样返回了Timestamp对象,整列都是同类型Timestamp的情况下,pandas会自动将列的dtype调整为更紧凑高效的datetime64[ns],而非继续使用空间占用更高的object类型,这是pandas的内置类型推断优化逻辑。
疑问3:如何在自定义函数中去除日期后的00:00:00?
首先注意你当前定义的函数def date_func(value)末尾缺少冒号,属于语法错误,运行前需要先补上。你可以根据需求选择以下两种处理方案:
方案1:保留日期对象类型,仅去除时分秒
修改函数返回Timestamp对应的date对象即可:
def date_func(value): print(type(value)) # 提取纯日期部分,返回datetime.date类型对象 return value.date() df["date"] = df["date"].apply(date_func)
处理后date列的dtype为object,打印时不会显示时分秒。
方案2:转为YYYY-MM-DD格式的字符串
修改函数返回格式化后的字符串:
def date_func(value): print(type(value)) # 格式化输出为指定格式的日期字符串 return value.strftime("%Y-%m-%d") df["date"] = df["date"].apply(date_func)
处理后date列存储字符串类型的日期,不会显示时分秒。
性能优化提示:无需自定义函数调用apply,直接使用pandas内置的dt属性处理效率更高,等效写法如下:
转纯日期对象:df["date"] = df["date"].dt.date
转日期字符串:df["date"] = df["date"].dt.strftime("%Y-%m-%d")
内容的提问来源于stack exchange,提问作者afternoon_drinker
相关产品推荐
相关产品推荐

