Pandas数据框列名转日期遇弃用警告:问题与解决
Pandas日期列名转换与警告处理
问题背景
现有一个Pandas数据框,仅部分列名为日期格式(示例中日期为字符串类型,实际为object类型):
import pandas as pd df = pd.DataFrame({ "activity": ["clean dishes", "fix porch", "slep on couch"], "finished": ["NaT", "NaT", "2022-12-29"], "2022-12-27 00:00:00": [1,1,1], "2022-12-28 00:00:00": [1,1,1], "2022-12-29 00:00:00": [1,1,0] }) print(df.columns) # 输出:Index(['activity', 'finished', 2022-12-27 00:00:00, 2022-12-28 00:00:00, 2022-12-29 00:00:00], dtype='object')
需求是将最后三列的列名转换为仅含日期(不含时间戳)的格式,以便和finished列中的日期比较,在活动完成前的对应位置填充0。尝试过相关转换方法但未生效。
尝试的代码及警告
编写了以下代码尝试转换列名:
from datetime import datetime import pandas as pd def format_header_dates(dataframe): """将表头中的日期转换为日期格式""" for column in dataframe.columns: if isinstance(column, pd.Timestamp): new_column = pd.Timestamp(column).date() dataframe = dataframe.rename(columns={column: new_column}) return dataframe df = format_header_dates(df)
运行后触发以下警告:
FutureWarning: Comparison of Timestamp with datetime.date is deprecated in order to match the standard library behavior. In a future version these will be considered non-comparable. Use 'ts == pd.Timestamp(date)' or 'ts.date() == date' instead. return key in self._engine
疑问
- 是否有更优的方法转换部分列名为日期格式?
- 该警告的触发原因是什么(是否由
isinstance导致),如何修正?
解决方案
经过排查,找到可规避警告且完成需求的方法:
- 步骤1:使用
pd.to_datetime(column).normalize().to_datetime64()将日期列名转换为datetime64[ns]类型并标准化(将时分秒纳秒设为0,无需保留该精度)。 - 步骤2:执行日期比较等所需操作。
- 步骤3:使用
pd.to_datetime(column).to_datetime64().astype('datetime64[D]')仅保留日期部分,完成格式美化。
此方法可顺利完成所有日期操作,且不再触发上述FutureWarning。
内容的提问来源于stack exchange,提问作者Filipe
相关产品推荐
相关产品推荐

