咨询:使用time/datetime获取生日日历信息的简便方式(Pandas freq失效)
嘿,我懂你想要简化生日日历信息获取的需求,之前用datetime写得繁琐确实头疼,其实不管是用Pandas还是优化datetime的写法,都能让代码简洁很多,给你分享两种实用的方法~
方法1:用Pandas快速生成并提取信息
你之前说Pandas的date_range用不好freq参数,其实如果是固定月日的生日,不用date_range也能轻松生成所有年份的日期,而且Pandas的dt属性可以直接提取周数、星期几这些信息,非常省心:
import pandas as pd # 替换成你的生日列表(格式:(月, 日)) myBirthdays = [(5, 20), (10, 15)] start_year = 1990 # 替换成你要统计的起始年份 end_year = 2024 # 生成所有年份的生日日期,自动处理闰年2月29日的情况 birthday_dates = [] for year in range(start_year, end_year + 1): for month, day in myBirthdays: try: birthday_dates.append(pd.Timestamp(year, month, day)) except ValueError: # 如果是闰年的2月29日,非闰年自动替换为2月28日 if month == 2 and day == 29: birthday_dates.append(pd.Timestamp(year, 2, 28)) # 转成DataFrame,一键提取所需信息 birthday_df = pd.DataFrame({"birthday": birthday_dates}) birthday_df["year"] = birthday_df["birthday"].dt.year birthday_df["iso_week_number"] = birthday_df["birthday"].dt.isocalendar().week birthday_df["weekday_name"] = birthday_df["birthday"].dt.day_name() # 查看结果 print(birthday_df)
为什么这更简便?
- Pandas的
dt属性封装了所有日期相关的提取逻辑,不用自己手动计算周数、星期几; isocalendar().week直接获取ISO标准的周数,比自己处理跨年周的问题靠谱;- 内置的异常处理可以轻松搞定闰年2月29日的特殊情况。
方法2:纯datetime + calendar库简化写法
如果你不想用Pandas,用标准库也能大幅简化代码,借助datetime的isocalendar方法和calendar库的星期名称映射:
from datetime import datetime import calendar myBirthdays = [(5, 20), (10, 15)] start_year = 1990 end_year = 2024 birthday_details = [] for year in range(start_year, end_year + 1): for month, day in myBirthdays: # 处理日期生成,兼容闰年2月29日 try: birth_date = datetime(year, month, day) except ValueError: if month == 2 and day == 29: birth_date = datetime(year, 2, 28) # 提取所需信息 iso_week = birth_date.isocalendar()[1] weekday = calendar.day_name[birth_date.weekday()] birthday_details.append({ "date": birth_date.strftime("%Y-%m-%d"), "year": year, "iso_week_number": iso_week, "weekday": weekday }) # 打印结果 for detail in birthday_details: print(detail)
核心优化点
- 用
datetime.isocalendar()直接获取ISO周数,不用自己写周数计算逻辑; calendar.day_name直接映射出星期的完整名称,不用手动对应数字和名称;- 统一的异常处理解决闰年的特殊场景,代码逻辑更清晰。
不管选哪种方法,核心都是利用库的内置方法替代手动计算,这样不仅代码更简洁,还能避免自己写逻辑时可能出现的错误(比如周数跨年、闰年处理等)。
内容的提问来源于stack exchange,提问作者TASC Solutions
相关产品推荐
相关产品推荐

