Python中的日期计算

1 投票
2 回答
3663 浏览
提问于 2025-04-16 00:56

我刚开始学习Python,正在尝试写一些日期计算的函数。

  • 找出指定日期的那个星期一是哪一天。
  • 找出指定日期所在月份的第一个非周末的工作日。
  • 找出指定日期所在年份的第一个非周末的工作日。
  • 找出指定日期所在月份的第N个[星期几]。

这是我目前的尝试——如果有更好的方法或者需要改正的地方,请告诉我。

import datetime

def find_month_first_monday(tstamp = datetime.today()):
    day_of_month = datetime.date.today().timetuple()[2]
    day_of_week = datetime.weekday(tstamp)
    # now I have the dow, and dom, I can index into a 2D array of
    # dates for the month - IF I knew how to get to that array ...


def find_first_gbd_in_month(tstamp = datetime.today()):
    # naive way would be to find the month and year from the passed in arg,
    # calculate the first day for that month/year and iterate until a non-weekend day
    # is found. Not elegant, there must be a better way
    pass


def find_first_gbd_in_year(tstamp = datetime.today()):
   # Ditto, as above.
    pass


def find_ndow_in_month(tstamp = datetime.today()):
    # again, I can get the month and the year from the passed in argument
    # what I need is a 2D array of dates for the month/year, so I can get
    # the nth dow (similar to reading off a calendar)
    pass

2 个回答

4

可以使用非常棒的 dateutil 模块。用它来做日期计算非常简单。

这里有一些例子:

import datetime
from dateutil import rrule
today = datetime.date.today()

这个例子是找出每个月的第一个星期五,持续10个月:

print list(rrule.rrule(rrule.MONTHLY, count=10, byweekday=rrule.FR(1),
    dtstart=today)))

结果:

[datetime.datetime(2010, 8, 2, 0, 0),
 datetime.datetime(2010, 9, 6, 0, 0),
 datetime.datetime(2010, 10, 4, 0, 0),
 datetime.datetime(2010, 11, 1, 0, 0),
 datetime.datetime(2010, 12, 6, 0, 0),
 datetime.datetime(2011, 1, 3, 0, 0),
 datetime.datetime(2011, 2, 7, 0, 0),
 datetime.datetime(2011, 3, 7, 0, 0),
 datetime.datetime(2011, 4, 4, 0, 0),
 datetime.datetime(2011, 5, 2, 0, 0)]

这个例子是找出每年的第一个星期一,持续3年:

print list(rrule.rrule(rrule.YEARLY, count=3, byweekday=rrule.MO(1),
    dtstart=datetime.date.today()))

结果:

[datetime.datetime(2011, 1, 3, 0, 0),
 datetime.datetime(2012, 1, 2, 0, 0),
 datetime.datetime(2013, 1, 7, 0, 0)]
4

找出月份的第一个星期一

我会用一种不同的方法。首先,找出这个月的第一天。

first_day_of_month = datetime.date.today().replace(day=1)

然后找出这个第一天是星期几,

week_day = first_day_of_month.weekday()

如果需要的话,再加上几天。

if week_day:
  first_day_of_month += datetime.timedelta(days=7-week_day)

找出月份的第一个假日

这个方法和找出月份的第一个星期一类似,但只有在星期几是5或6(也就是星期六和星期天)的时候才加上那一天。

找出年份的第一个假日

.replace中也要提供month=1这个参数。

找出月份的第n个星期

先找出这一周的第一天,然后再加上n-1个星期

撰写回答