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

如何用Python遍历2018年3月29日至今日期并按日保存CSV数据

解决方案:遍历日期+每日CSV存储(附datetime进阶用法)

Got it, let's tackle your problem step by step. I'll refactor your code to iterate through every date from March 29, 2018 to today, save daily MLB odds data to separate CSV files, and show you a more flexible way to use the datetime module with date objects and timedelta.

修改后的完整代码

import csv
import requests
import datetime
from pprint import pprint

def fetch_and_save_mlb_odds(target_date):
    # 格式化日期为API需要的字符串格式
    date_str = target_date.strftime('%Y%m%d')
    # 构建每日CSV文件名
    filename = f"BOOKS_{date_str}.csv"
    
    # 初始化CSV文件并写入表头
    with open(filename, "w", newline='', encoding='utf-8') as outfile:
        writer = csv.writer(outfile)
        header = ["book_ids","status","away_team_id","away_rot","ml_away","spread_away","spread_away_line","home_team_id", 
                  "home_rot","ml_home","spread_home","spread_home_line","over","under","total","type_odds","insert","time", 
                  "one_tm_id","one_tm","one_team","two_tm_id","two_tm","two_team"]
        writer.writerow(header)
        
        # 调用API获取当日数据
        try:
            req2 = requests.get(f'https://api-prod.sprtactn.co/web/v1/scoreboard/mlb?bookIds=21,1,55&date={date_str}')
            req2.raise_for_status()  # 检查请求是否成功
            odd = req2.json()['games']
            
            # 遍历赛事和赔率数据
            for info in odd:
                time = info['start_time']
                status = info['status']
                away_rot = info['away_rotation_number']
                home_rot = info['home_rotation_number']
                away_team_id = info['away_team_id']
                home_team_id = info['home_team_id']
                teams = info['teams']
                vegas = info['odds']
                
                one_team = teams[0]['full_name']
                one_tm = teams[0]['abbr']
                one_tm_id = teams[0]['id']
                two_team = teams[1]['full_name']
                two_tm = teams[1]['abbr']
                two_tm_id = teams[1]['id']
                
                for odds in vegas:
                    ml_away = odds['ml_away']
                    ml_home = odds['ml_home']
                    type_odds = odds['type']
                    insert = odds['inserted']
                    book_ids = odds['book_id']
                    spread_away = odds['spread_away']
                    spread_home = odds['spread_home']
                    spread_away_line = odds['spread_away_line']
                    spread_home_line = odds['spread_home_line']
                    over = odds['over']
                    under = odds['under']
                    total = odds['total']
                    
                    # 写入当前赔率数据行
                    writer.writerow([book_ids, status, away_team_id, away_rot, ml_away, spread_away, spread_away_line, 
                                     home_team_id, home_rot, ml_home, spread_home, spread_home_line, over, under, total, 
                                     type_odds, insert, time, one_tm_id, one_tm, one_team, two_tm_id, two_tm, two_team])
            print(f"Successfully saved data for {date_str} to {filename}")
        except Exception as e:
            print(f"Failed to process {date_str}: {str(e)}")

# --------------------------
# 核心:使用datetime.date + timedelta遍历日期范围
# --------------------------
# 定义起始日期(2018年3月29日)
start_date = datetime.date(2018, 3, 29)
# 获取当前日期
end_date = datetime.date.today()

# 逐日遍历
current_date = start_date
while current_date <= end_date:
    fetch_and_save_mlb_odds(current_date)
    # 日期加1天
    current_date += datetime.timedelta(days=1)

关键逻辑解释

1. datetime模块的进阶用法(替代原有单一日期获取)

原来的代码只用了datetime.datetime.now()获取当前时间,这里我们用**datetime.date对象和timedelta**来处理日期范围遍历:

  • datetime.date(2018, 3, 29):创建一个固定的起始日期对象(只包含年/月/日,没有时间部分,更适合纯日期场景)
  • datetime.date.today():获取当前系统日期(同样是date对象)
  • current_date += datetime.timedelta(days=1):让日期逐日递增,这是遍历日期范围最简洁的方式之一

2. 每日CSV文件生成

我们把日期格式化为%Y%m%d(比如20180329),拼接到文件名中:

filename = f"BOOKS_{date_str}.csv"

这样每个日期对应一个独立的CSV文件,符合你的命名要求。

3. 代码模块化重构

把API请求、数据写入的逻辑封装成fetch_and_save_mlb_odds函数,传入目标日期作为参数,让代码更清晰、易维护,也方便后续扩展(比如添加日志、批量重试等)。

4. 异常处理优化

添加了try-except块捕获API请求或数据处理中的异常,避免单个日期的失败导致整个程序中断,同时打印错误信息方便排查问题。

内容的提问来源于stack exchange,提问作者Michael T Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:39:53