如何将int64类型的年月列转为datetime并保留原显示格式?
解决方案
要在将Tranc_Year和Tranc_Month转为datetime类型的同时保留原数字样式的显示,可通过以下两种方法实现:
方法1:转换后设置列的显示格式(保留datetime数据类型)
先按原逻辑将整数转为datetime类型,再通过样式格式化控制显示效果,既保留datetime类型用于后续时间操作,又能显示原有的年份/月份数字:
import pandas as pd # 转换为datetime类型 df_train['Tranc_Year'] = pd.to_datetime(df_train['Tranc_Year'], format='%Y') df_train['Tranc_Month'] = pd.to_datetime(df_train['Tranc_Month'], format='%m') # 设置显示格式:年份显示为4位数字,月份显示为无前置0的数字(与原int格式一致) styled_df = df_train.style.format({ 'Tranc_Year': lambda x: x.strftime('%Y'), 'Tranc_Month': lambda x: x.strftime('%m').lstrip('0') }) # 输出格式化后的DataFrame display(styled_df)
方法2:合并年/月为完整日期(更符合datetime使用逻辑)
单独的年份或月份作为datetime类型实际意义有限,更合理的做法是合并为完整日期,再按需提取年/月的显示:
# 合并年和月为当月第一天的datetime df_train['Tranc_Date'] = pd.to_datetime( df_train['Tranc_Year'].astype(str) + '-' + df_train['Tranc_Month'].astype(str), format='%Y-%m' ) # 提取年份和月份(保留原数字样式的int类型) df_train['Tranc_Year'] = df_train['Tranc_Date'].dt.year df_train['Tranc_Month'] = df_train['Tranc_Date'].dt.month
问题原因解释
你之前的代码转换后显示变化,是因为pd.to_datetime处理单独的年份或月份时,会自动补全为完整的日期:
- 传入年份整数时,默认补全为当年的1月1日(如
2023转为2023-01-01) - 传入月份整数时,默认补全为1900年的对应月份1日(如
5转为1900-05-01)
因此显示的是完整日期字符串,而非原有的数字样式。
内容的提问来源于stack exchange,提问作者ricenix
相关产品推荐
相关产品推荐

