Python中如何比较不同长度的DateTimeIndex列表并统计共同元素?
问题解决思路及修复代码
错误原因
zip参数长度不匹配:emergency_medicine_start_dates和emergency_medicine_end_dates两个列表长度不一致,导致zip无法一一配对,触发ValueError。- 冗余的数据结构:你把
pandas.date_range生成的DateTimeIndex都套在了列表里,比如em_rotation_request_time_period = [pd.date_range(...)],这完全没必要,还会增加后续日期比较的复杂度。 - 日期比较逻辑错误:直接用
dates == dates_2是在判断两个DateTimeIndex对象是否完全相同(长度、所有元素都一致),根本不是统计两者的共同日期数量,和你要的“至少21个共同日期”需求不符。
修复代码及步骤
1. 先解决zip长度不匹配问题
先确保两个日期列表长度一致,取较短的长度来循环:
import pandas as pd # 示例原始日期列表(替换成你的实际数据) emergency_medicine_start_dates = ["9/20/2025", "10/1/2025"] emergency_medicine_end_dates = ["10/5/2025", "10/30/2025", "11/5/2025"] # 对齐两个列表的长度,取较短的那个 min_len = min(len(emergency_medicine_start_dates), len(emergency_medicine_end_dates)) emergency_medicine_start_dates = emergency_medicine_start_dates[:min_len] emergency_medicine_end_dates = emergency_medicine_end_dates[:min_len]
2. 简化数据结构,生成正确的日期范围
不要把DateTimeIndex包在列表里,直接存储对象即可:
# 直接生成请求时间段的DateTimeIndex,无需套列表 em_rotation_request_time_period = pd.date_range(start="9/25/2025", end="10/26/2025", freq="D") em_rotation_schedule = [] for start_date, end_date in zip(emergency_medicine_start_dates, emergency_medicine_end_dates): # 生成单个日程的日期范围,直接存入列表 date_range = pd.date_range(start=start_date, end=end_date, freq="D") em_rotation_schedule.append(date_range)
3. 正确统计共同日期数量
用pandas的intersection方法获取两个日期范围的交集,统计总共同日期数:
brooklyn_va_rotation_slots = 3 total_common_dates = 0 for schedule_dates in em_rotation_schedule: # 获取当前日程与请求时间段的共同日期 common_dates = schedule_dates.intersection(em_rotation_request_time_period) total_common_dates += len(common_dates) # 总共同日期≥21时,减少可用slot(如果只需要减一次,可加break) if total_common_dates >= 21: brooklyn_va_rotation_slots -= 1 # break # 若只需减一次,取消注释此行 print("Number of Rotation slots available at the Brooklyn VA:", brooklyn_va_rotation_slots)
可选:用集合方式统计
如果不需要保留DateTimeIndex的特性,也可以转成日期集合来计算交集:
# 把请求时间段转成日期对象的集合 request_dates_set = set(em_rotation_request_time_period.date) total_common = 0 for schedule_dates in em_rotation_schedule: schedule_set = set(schedule_dates.date) # 计算两个集合的交集长度 common_count = len(schedule_set & request_dates_set) total_common += common_count if total_common >= 21: brooklyn_va_rotation_slots -= 1 # break print("Number of Rotation slots available at the Brooklyn VA:", brooklyn_va_rotation_slots)
额外说明
- 如果你的需求是单个日程时间段与请求时间段的共同日期≥21就减少slot,把判断条件改成
len(common_dates) >= 21即可,无需累加总数。 - 确保
emergency_medicine_start_dates和emergency_medicine_end_dates里的日期格式是pandas可识别的,若格式异常,可先用pd.to_datetime()转换。
内容的提问来源于stack exchange,提问作者Zero164
相关产品推荐
相关产品推荐

