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

咨询:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:31:45