如何在Python Pandas中合并两列生成日-月-年格式日期?
解决DataFrame合并年份与月份列并转换为日-月-年格式日期的问题
问题说明
需要把DataFrame里的整数类型Year列和对象类型Period列合并成一列,最终整理成日-月-年格式的日期,但合并及日期转换过程中遇到了问题。
示例数据:
Series Id Year Period Value 0 CUSR0000SAF1 2012 M01 232.213 1 CUSR0000SAF1 2012 M02 232.140 2 CUSR0000SAF1 2012 M03 232.591 3 CUSR0000SAF1 2012 M04 233.044 4 CUSR0000SAF1 2012 M05 233.219
已尝试的无效代码:
df['Year'] = pd.to_datetime(df['Year'], format="%d/%m/%Y")
解决方案
步骤1:提取月份并拼接日期字符串
Period列格式是MXX,先提取其中的月份数字,再和Year拼接成YYYY-MM格式的字符串(默认取当月第一天作为日期):
# 去掉Period里的'M'前缀,提取月份数字 df['Month'] = df['Period'].str.replace('M', '') # 拼接成年份-月份的字符串 df['Date_str'] = df['Year'].astype(str) + '-' + df['Month']
步骤2:转换为datetime类型并格式化输出
把拼接好的字符串转为datetime类型,再通过dt.strftime格式化成日-月-年格式:
# 转换为datetime类型 df['Date'] = pd.to_datetime(df['Date_str']) # 格式化为日-月-年的字符串形式 df['Formatted_Date'] = df['Date'].dt.strftime('%d-%m-%Y')
完整代码示例
import pandas as pd # 构造示例数据 data = { 'Series Id': ['CUSR0000SAF1']*5, 'Year': [2012]*5, 'Period': ['M01', 'M02', 'M03', 'M04', 'M05'], 'Value': [232.213, 232.140, 232.591, 233.044, 233.219] } df = pd.DataFrame(data) # 执行日期处理流程 df['Month'] = df['Period'].str.replace('M', '') df['Date_str'] = df['Year'].astype(str) + '-' + df['Month'] df['Date'] = pd.to_datetime(df['Date_str']) df['Formatted_Date'] = df['Date'].dt.strftime('%d-%m-%Y') # 查看最终结果 print(df[['Series Id', 'Formatted_Date', 'Value']])
结果输出
Series Id Formatted_Date Value 0 CUSR0000SAF1 01-01-2012 232.213 1 CUSR0000SAF1 01-02-2012 232.140 2 CUSR0000SAF1 01-03-2012 232.591 3 CUSR0000SAF1 01-04-2012 233.044 4 CUSR0000SAF1 01-05-2012 233.219
补充说明
- 原尝试代码出错原因:直接把整数类型的
Year按%d/%m/%Y格式转换,该格式要求输入是日/月/年的字符串,和整数年份不匹配,导致转换失败。 - 如果需要用当月最后一天作为日期,可以用
pd.offsets.MonthEnd(0)调整:
df['Date'] = pd.to_datetime(df['Date_str']) + pd.offsets.MonthEnd(0) df['Formatted_Date'] = df['Date'].dt.strftime('%d-%m-%Y')
此时结果会显示当月最后一天,比如31-01-2012、29-02-2012等。
内容的提问来源于stack exchange,提问作者Michelle
相关产品推荐
相关产品推荐

