Pandas格式化DataFrame中除首列外的日期时间列标题
格式化Pandas DataFrame中的Datetime类型列标题
这问题我之前也碰到过,处理datetime类型的列标题其实很简单,用列表推导式或者自定义映射函数就能轻松搞定,结合你的测试数据,给你具体的解决方案:
基础解决方案(针对datetime.datetime类型列名)
先把你的测试数据补全,然后直接处理列名:
import pandas as pd import datetime # 测试数据 d = { datetime.datetime(2018, 1, 31, 8, 0): [9.1, 8.5, 7.4, 6.5, 5.3], datetime.datetime(2018, 2, 28, 9, 0): [9.2, 8.5, 7.2, 6.1, 5.2], datetime.datetime(2018, 3, 31, 10, 0): [9.3, 8.5, 7.1, 6.1, 5.1], 'ID': [1, 2, 3, 4, 5], } # 构建完整的DataFrame df = pd.DataFrame(d, columns=['ID', datetime.datetime(2018, 1, 31, 8, 0), datetime.datetime(2018, 2, 28, 9, 0), datetime.datetime(2018, 3, 31, 10, 0)]) # 格式化datetime类型列标题:这里用'%Y-%m-%d %H:%M'格式,你可以按需调整 df.columns = [col.strftime('%Y-%m-%d %H:%M') if isinstance(col, datetime.datetime) else col for col in df.columns] # 查看处理后的列名 print(df.columns)
运行后,列名会变成:Index(['ID', '2018-01-31 08:00', '2018-02-28 09:00', '2018-03-31 10:00'], dtype='object')
兼容Pandas Timestamp类型的情况
如果你是从Excel读取的数据,列名可能会被解析成pd.Timestamp类型(而非原生datetime),这时候只需要扩展判断条件,同时兼容两种类型:
# 兼容datetime和Timestamp的格式化逻辑 df.columns = [col.strftime('%Y-%m-%d %H:%M') if isinstance(col, (datetime.datetime, pd.Timestamp)) else col for col in df.columns]
更灵活的自定义格式化函数
如果你的格式化逻辑比较复杂(比如不同日期需要显示不同格式),可以写一个自定义函数,用map方法批量处理:
def format_column_name(col): # 判断是否为日期时间类型 if isinstance(col, (datetime.datetime, pd.Timestamp)): # 自定义格式:比如只显示日期部分 return col.strftime('%Y-%m-%d') # 非日期时间类型的列名直接返回 return col # 应用格式化函数到所有列名 df.columns = df.columns.map(format_column_name)
这样处理后,日期列名会变成2018-01-31这种纯日期格式,完全可以根据你的需求调整格式字符串。
内容的提问来源于stack exchange,提问作者ProgSky
相关产品推荐
相关产品推荐

