如何用Python将SQL查询结果按日期分别保存为CSV文件
按日期拆分数据并保存为独立CSV文件的解决方案
方法一:Python端处理(推荐,效率更高)
既然已经用pd.read_sql拿到了全量数据,直接在Python里拆分是最省事的,步骤如下:
确保日期字段格式正确
先把Date列转换成datetime类型,避免字符串格式匹配问题:df['Date'] = pd.to_datetime(df['Date'])提取唯一日期列表
如果你只需要按「日期部分」拆分(不含时分秒),用dt.date提取:unique_dates = df['Date'].dt.date.unique()如果要保留完整datetime(比如同一天不同时间的记录分开存),直接用
unique():unique_dates = df['Date'].unique()循环拆分并保存CSV
遍历每个唯一日期,过滤对应数据后保存,文件名用格式化日期避免特殊字符:for date in unique_dates: # 过滤数据:按日期部分匹配就用dt.date,完整datetime直接匹配 filtered_df = df[df['Date'].dt.date == date] # 格式化日期为文件名友好格式,比如20240520 filename = f"product_data_{date.strftime('%Y%m%d')}.csv" filtered_df.to_csv(filename, index=False)
方法二:SQL层面拆分(适合超大数据量)
如果数据量极大,一次性加载到内存压力大,可以先通过SQL获取所有唯一日期,再循环查询每个日期的数据:
用CTE获取唯一日期
先执行查询拿到所有不重复的日期:# 替换成你的原CTE逻辑 date_query = """ WITH original_cte AS ( SELECT Product_ID, Date, Price, Comment FROM your_table ) SELECT DISTINCT Date FROM original_cte """ dates_df = pd.read_sql(date_query, engine) # 转换为列表 date_list = dates_df['Date'].tolist()循环查询每个日期的数据并保存
for date in date_list: # 用参数化查询避免SQL注入 data_query = """ WITH original_cte AS ( SELECT Product_ID, Date, Price, Comment FROM your_table ) SELECT * FROM original_cte WHERE Date = %(date_param)s """ daily_df = pd.read_sql(data_query, engine, params={'date_param': date}) filename = f"product_data_{pd.to_datetime(date).strftime('%Y%m%d')}.csv" daily_df.to_csv(filename, index=False)这种方法需要多次访问数据库,效率不如一次性加载后处理,仅适合数据量特别大的场景。
注意事项
- 文件名用
%Y%m%d格式可以避免斜杠等特殊字符导致的路径错误 - 如果
Date字段包含时分秒,根据需求选择按完整时间还是仅日期拆分 - 方法二中必须用参数化查询(
params参数),避免SQL注入风险
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

