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

Python中如何比较不同长度的DateTimeIndex列表并统计共同元素?

问题解决思路及修复代码

错误原因

  1. zip参数长度不匹配:emergency_medicine_start_dates和emergency_medicine_end_dates两个列表长度不一致,导致zip无法一一配对,触发ValueError。
  2. 冗余的数据结构:你把pandas.date_range生成的DateTimeIndex都套在了列表里,比如em_rotation_request_time_period = [pd.date_range(...)],这完全没必要,还会增加后续日期比较的复杂度。
  3. 日期比较逻辑错误:直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:35:06