拆分含日期时间的列时遇ValueError:列长度需与键一致
问题原因与解决方法
核心错误分析
- str.extract列数不匹配:你的正则仅捕获了日期组
(\d{2}/\d{2}/\d{4}),仅返回1列数据,但要赋值给['Created Date', 'Time']两列,直接触发"Columns must be same length as key"错误。 - str.split语法错误:代码中
df['Created Date'.str.split缺少闭合方括号,正确写法应为df['Created Date'].str.split;此外若存在部分行无时间信息,拆分后仅返回1列,与目标列数不匹配也会报错。 - 数据格式不统一:部分行不符合
mm/dd/yyyy 00:00:00 AM/PM格式(如缺失时间、分隔符异常),导致拆分后列数不一致。
具体解决方法
方法1:修正str.extract正则,同时捕获日期和时间
调整正则表达式,同时匹配日期与时间部分,确保返回2列,即使部分行无时间也会用空值填充:
df_small[['Created Date', 'Time']] = df['Created Date'].str.extract(r'(\d{2}/\d{2}/\d{4})\s*(.*)', expand=True)
- 说明:
(\d{2}/\d{2}/\d{4})捕获日期,\s*匹配任意空格,(.*)捕获剩余所有内容作为时间(含AM/PM)。
方法2:修正str.split并强制统一列数
修复语法错误后,限制拆分次数,同时确保结果为固定2列:
# 按第一个空格拆分,最多生成2列 split_result = df['Created Date'].str.split(' ', n=1, expand=True) # 强制转为2列,缺失部分用空值填充 split_result = split_result.reindex(columns=[0, 1], fill_value='') # 赋值到目标列 df_small[['Created Date', 'Time']] = split_result
- 说明:
n=1避免时间内部空格导致多列,reindex保证列数统一。
方法3:转换为datetime类型后提取(最稳妥)
先将列转为datetime类型,再直接提取日期和时间,规避格式不统一问题:
# 转换为datetime,格式错误的行转为NaT df['Created Date'] = pd.to_datetime(df['Created Date'], format='%m/%d/%Y %I:%M:%S %p', errors='coerce') # 提取日期和时间 df_small['Created Date'] = df['Created Date'].dt.date df_small['Time'] = df['Created Date'].dt.time
- 说明:
format指定输入格式,errors='coerce'处理异常行,后续提取操作更可靠。
额外:排查异常数据
可先定位格式异常的行,方便清洗:
# 找出拆分后列数不足的行 mask = df['Created Date'].str.split(' ', n=1, expand=True).isna().any(axis=1) print(df[mask]) # 用正则匹配找出不符合标准格式的行 pattern = r'^\d{2}/\d{2}/\d{4}\s+\d{2}:\d{2}:\d{2}\s+(AM|PM)$' mask = ~df['Created Date'].str.match(pattern, na=False) print(df[mask])
内容的提问来源于stack exchange,提问作者Sadie Brown
相关产品推荐
相关产品推荐

