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
相关产品推荐
相关产品推荐

