You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拆分含日期时间的列时遇ValueError:列长度需与键一致

问题原因与解决方法

核心错误分析

  1. str.extract列数不匹配:你的正则仅捕获了日期组(\d{2}/\d{2}/\d{4}),仅返回1列数据,但要赋值给['Created Date', 'Time']两列,直接触发"Columns must be same length as key"错误。
  2. str.split语法错误:代码中df['Created Date'.str.split缺少闭合方括号,正确写法应为df['Created Date'].str.split;此外若存在部分行无时间信息,拆分后仅返回1列,与目标列数不匹配也会报错。
  3. 数据格式不统一:部分行不符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:22:40