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

Python字典日期匹配:调整datetime间隔匹配字典键的问题求助

问题:追溯匹配字典中的日期键

我有如下格式的字典:

days_data = {
    '2023-04-14': {'1. open': '183.95', '2. high': '186.28', '3. low': '182.01', '4. close': '185.0', '5. adjusted close': '185.0', '6. volume': '96438664', '7. dividend amount': '0.0000', '8. split coefficient': '1.0'},
    '2023-04-13': {'1. open': '182.955', '2. high': '186.5', '3. low': '180.94', '4. close': '185.9', '5. adjusted close': '185.9', '6. volume': '112932985', '7. dividend amount': '0.0000', '8. split coefficient': '1.0'},
    '2023-04-12': {'1. open': '190.74', '2. high': '191.5846', '3. low': '180.31', '4. close': '180.54', '5. adjusted close': '180.54', '6. volume': '150256278', '7. dividend amount': '0.0000', '8. split coefficient': '1.0'}
}

我想借助datetime模块,从昨日日期开始匹配字典中的键,匹配失败就把间隔天数加1,向前追溯更早的日期,直到找到匹配的键。我写了这段代码:

import datetime as dt

today = dt.date.today() # 示例中等于2023-04-17
interval = 1
yesterday = dt.date.today() - dt.timedelta(days=interval) # 示例中等于2023-04-16
for key in days_data:
    if key == str(yesterday):
        print("equal")
    else:
        yesterday = dt.date.today() - dt.timedelta(days=interval + 1)

但这段代码无法正常工作——它会把第一个键'2023-04-14'和当前的yesterday值比较,不匹配就直接跳到下一个键,而不是保持当前日期检查逻辑,把yesterday更新为更早的日期(比如从2023-04-16→2023-04-15→2023-04-14)直到找到匹配项。试过try-except也没解决,求帮助。


问题分析

你的代码逻辑错误在于:循环遍历字典的每个键,每次不匹配就更新一次yesterday,但这会导致每次都是用新的yesterday去对比下一个键,而不是固定从目标日期开始,逐日向前检查是否存在于字典的键中。

正确实现

方式一:循环逐日追溯

适合需要严格按天向前排查的场景,设置最大追溯天数避免无限循环:

import datetime as dt

days_data = {
    '2023-04-14': {'1. open': '183.95', '2. high': '186.28', '3. low': '182.01', '4. close': '185.0', '5. adjusted close': '185.0', '6. volume': '96438664', '7. dividend amount': '0.0000', '8. split coefficient': '1.0'},
    '2023-04-13': {'1. open': '182.955', '2. high': '186.5', '3. low': '180.94', '4. close': '185.9', '5. adjusted close': '185.9', '6. volume': '112932985', '7. dividend amount': '0.0000', '8. split coefficient': '1.0'},
    '2023-04-12': {'1. open': '190.74', '2. high': '191.5846', '3. low': '180.31', '4. close': '180.54', '5. adjusted close': '180.54', '6. volume': '150256278', '7. dividend amount': '0.0000', '8. split coefficient': '1.0'}
}

today = dt.date.today()
current_date = today - dt.timedelta(days=1)  # 从昨日开始
max_days_to_check = 30  # 设置最大追溯天数

# 逐日向前检查
for i in range(max_days_to_check):
    date_str = current_date.strftime('%Y-%m-%d')
    if date_str in days_data:
        print(f"找到匹配日期:{date_str}")
        print("对应数据:", days_data[date_str])
        break
    # 日期往前推一天
    current_date -= dt.timedelta(days=1)
else:
    print(f"追溯{max_days_to_check}天后仍未找到匹配日期")

方式二:快速定位最近匹配日期

如果字典中日期数量较多,这种方式更高效,直接通过日期对比找到最近的匹配项:

import datetime as dt

days_data = {
    '2023-04-14': {'1. open': '183.95', '2. high': '186.28', '3. low': '182.01', '4. close': '185.0', '5. adjusted close': '185.0', '6. volume': '96438664', '7. dividend amount': '0.0000', '8. split coefficient': '1.0'},
    '2023-04-13': {'1. open': '182.955', '2. high': '186.5', '3. low': '180.94', '4. close': '185.9', '5. adjusted close': '185.9', '6. volume': '112932985', '7. dividend amount': '0.0000', '8. split coefficient': '1.0'},
    '2023-04-12': {'1. open': '190.74', '2. high': '191.5846', '3. low': '180.31', '4. close': '180.54', '5. adjusted close': '180.54', '6. volume': '150256278', '7. dividend amount': '0.0000', '8. split coefficient': '1.0'}
}

today = dt.date.today()
target_date = today - dt.timedelta(days=1)

# 将字典的日期键转为datetime.date对象
data_dates = [dt.datetime.strptime(date_str, '%Y-%m-%d').date() for date_str in days_data.keys()]
# 筛选出不晚于目标日期的所有日期
valid_dates = [date for date in data_dates if date <= target_date]

if valid_dates:
    # 找到其中最近的日期
    closest_date = max(valid_dates)
    closest_date_str = closest_date.strftime('%Y-%m-%d')
    print(f"找到最近匹配日期:{closest_date_str}")
    print("对应数据:", days_data[closest_date_str])
else:
    print("没有找到符合条件的日期")

内容的提问来源于stack exchange,提问作者elyaz98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:32:34