如何在Python中按特殊条件生成日期与年份列表?
自动生成日期列表及对应年份的解决方案
可以按照以下步骤实现自动生成符合要求的日期和年份列表,无需手动维护:
1. 生成并处理日期与年份
利用Pandas的date_range生成每月第一天的日期序列,再根据规则处理对应年份:
import pandas as pd # 定义时间范围(使用标准日期格式更稳妥) start_date = '2022-02-01' end_date = '2022-07-01' # 生成每月第一天的日期序列,freq='MS'代表Month Start(月初) date_range = pd.date_range(start=start_date, end=end_date, freq='MS') # 格式化日期并生成对应年份列表 formatted_dates = [] corresponding_years = [] for date in date_range: # 将日期格式化为你需要的'01Jan2022'样式,转大写确保月份缩写符合示例 formatted_date = date.strftime('%d%b%Y').upper() formatted_dates.append(formatted_date) # 处理年份规则:1月对应上一年,其余月份对应当年 if date.month == 1: year_str = str(date.year - 1) else: year_str = str(date.year) corresponding_years.append(year_str) # 将日期和年份配对,避免索引错位 date_year_pairs = list(zip(formatted_dates, corresponding_years))
2. 修改循环脚本适配自动生成的列表
修正你原代码中的参数缺失和函数名错误,遍历配对后的日期与年份:
Query = """select distinct A.name, count(A.number) from A, B where Date between A.Opendate and A.Enddate and B.Status='Y' Group by A.name""" def summary(Date, Year, Query): try: cur = conn() cur.execute(Query, {'Date': Date, 'Year':Year}) df = pd.DataFrame(cur.fetchall()) df.columns = [x[0] for x in cur.description] return df # 注意原代码里Return是大写,需改为小写return finally: cur.close() # 建议添加关闭游标,避免数据库资源泄漏 # 初始化空DataFrame用于拼接结果 final_df = pd.DataFrame() # 遍历所有日期-年份对,批量生成结果 for date, year in date_year_pairs: temp_df = summary(date, year, Query) final_df = pd.concat([final_df, temp_df], axis=0, ignore_index=True) # ignore_index避免索引重复
关键说明
pd.date_range(freq='MS')会直接生成指定时间段内每月第一天的datetime对象,无需手动构造日期。- 通过
date.month判断是否为1月,自动计算对应年份,彻底避免手动处理特殊情况。 - 用
zip将日期和年份配对,确保循环时二者始终一一对应,不会出现索引错位问题。 - 原代码中的
Return要改为小写return,同时建议添加游标关闭逻辑,防止数据库连接资源泄漏。
内容的提问来源于stack exchange,提问作者user20159866
相关产品推荐
相关产品推荐

