Pandas列重命名长度不匹配问题及日期格式修正咨询
问题分析与解决方案
错误原因
你的代码只生成了从第4列开始的62个新列名,但原DataFrame有65列,前3列(ID、Name、Date)没有被加入到new_col_names列表中,导致新列名长度(62)和原列数(65)不匹配,触发了ValueError。另外原代码还存在一个潜在问题:用'2022-12-0' + str(...)会让10号及以后的日期变成2022-12-010-IN这种错误格式。
快速修正原代码
保留前3列的原始列名,再拼接后面生成的新列名,同时修复日期补零逻辑:
n_cols = df.shape[1] # 先保留前3列的原始列名 new_col_names = df.columns[:3].tolist() for i in range(3, n_cols): day_num = ((i - 3) // 2) + 1 # 自动补零生成两位日期格式 day_str = f"{day_num:02d}" if (i - 3) % 2 == 0: new_col_names.append(f'2022-12-{day_str}-IN') else: new_col_names.append(f'2022-12-{day_str}-OUT') df.columns = new_col_names
更优方案:直接处理原始列名
不需要依赖列索引计算日期,直接提取原始列名中的日期部分格式化,更灵活且不易出错:
def format_col_name(col): # 非日期列直接返回原列名 if col in ['ID', 'Name', 'Date']: return col # 拆分原始列名,提取日期和后缀部分 parts = col.split('-') year, month, day = parts[0], parts[1], parts[2].zfill(2) suffix = '-'.join(parts[3:]) # 拼接成目标格式 return f"{year}-{month}-{day}-{suffix}" # 批量处理所有列名 df.columns = [format_col_name(col) for col in df.columns]
这个方案的优势:
- 不依赖列的索引位置,列顺序变化也能正常工作
- 自动处理所有日期(包括10号及以后),避免硬编码错误
- 兼容任意日期后缀(只要后缀在
-之后都能正确提取)
补充说明
如果你的日期范围是2022年1月至12月,只需调整上述代码中的日期提取逻辑即可,核心格式化逻辑通用。
内容的提问来源于stack exchange,提问作者Simon GIS
相关产品推荐
相关产品推荐

