Pandas:向单列添加多日期时遇ValueError错误求助
解决Pandas赋值时的
ValueError: Length of values does not match length of index问题 咱们先聊聊你遇到的这个问题到底出在哪:
- 你循环里生成的
sample_employee_clockin_dates是一个包含多个时间点的DatetimeIndex(比如从4:30到15:30的30分钟间隔序列,长度有23个),但你的原DataFramesample_employee_clockin只有1行。 - 而且循环逻辑还有个小坑:每次迭代都会覆盖
sample_employee_clockin_dates,最后它只保留了这唯一一行生成的长序列,直接赋值给只有1行的列,Pandas肯定会报错——长度对不上啊!
下面给你两种实用的解决方案,看你需求选就行:
方案1:把时间序列存成列表放在单元格里
如果你希望每个员工的30分钟间隔时间列表存在单独的单元格里,用apply替代循环更简洁高效:
import pandas as pd from pandas import Timestamp # 你的原始数据 sample_employee_clockin = pd.DataFrame({'direction_in': {15831: Timestamp('2019-06-25 04:37:59')}, 'emp': {15831: 73.0}, 'direction_out': {15831: Timestamp('2019-06-25 15:17:35')}, 'time_difference': {15831: '0 days 10:39:36'}, 'complete_record': {15831: 'yes'}, 'terminal': {15831: 1.0}, 'job_title': {15831: 44.0}, 'division': {15831: 1.0}}) # 定义生成时间间隔的函数 def get_30min_intervals(row): start_time = row["direction_in"].floor(freq="30min") end_time = row["direction_out"].ceil(freq="30min") return pd.date_range(start=start_time, end=end_time, freq='30min').tolist() # 给DataFrame新增列 sample_employee_clockin["clock_in_times"] = sample_employee_clockin.apply(get_30min_intervals, axis=1)
这样新列clock_in_times的每个单元格都是一个时间列表,和原DataFrame的行数完全匹配,不会再报错。
方案2:把时间序列拆成多行(每个时间点对应一行)
如果你的需求是后续要按时间维度分析,想让每个30分钟时间点单独占一行,保留员工的其他信息,可以在方案1的基础上用explode拆分:
# 先生成包含时间列表的列(同方案1) sample_employee_clockin["clock_in_times"] = sample_employee_clockin.apply(get_30min_intervals, axis=1) # 把列表拆分成多行 expanded_df = sample_employee_clockin.explode("clock_in_times")
处理后,每个时间点都会对应一行原员工的记录,方便后续统计分析。
内容的提问来源于stack exchange,提问作者resolver101
相关产品推荐
相关产品推荐

