Rya*_*ery 23 python datetime calendar
使用Python ...
如何在一年中选择所有星期日(或任何一天)?
[ '01/03/2010','01/10/2010','01/17/2010','01/24/2010', ...]
Run Code Online (Sandbox Code Playgroud)
这些日期代表2010年的星期日.这也适用于我认为的一周中的任何一天.
sth*_*sth 46
您可以使用date该datetime模块查找一年中的第一个星期日,然后继续添加七天,生成新的星期日:
from datetime import date, timedelta
def allsundays(year):
d = date(year, 1, 1) # January 1st
d += timedelta(days = 6 - d.weekday()) # First Sunday
while d.year == year:
yield d
d += timedelta(days = 7)
for d in allsundays(2010):
print(d)
Run Code Online (Sandbox Code Playgroud)
Bra*_*mon 22
Pandas 的功能为此目的提供了date_range()强大的功能。
结果是一个 pandas DatetimeIndex,但可以轻松转换为列表。
import pandas as pd
def allsundays(year):
return pd.date_range(start=str(year), end=str(year+1),
freq='W-SUN').strftime('%m/%d/%Y').tolist()
allsundays(2017)[:5] # First 5 Sundays of 2017
# ['01/01/2017', '01/08/2017', '01/15/2017', '01/22/2017', '01/29/2017']
Run Code Online (Sandbox Code Playgroud)
小智 8
使用列表理解:
from datetime import date, timedelta
dstart = date(2018,1,1)
dend = date(2018,12,31)
# this will return all sundays between start-end dates.
days = [dstart + timedelta(days=x) for x in range((dend-dstart).days + 1) if (dstart + timedelta(days=x)).weekday() == 6]
Run Code Online (Sandbox Code Playgroud)
使用dateutil模块,您可以这样生成列表:
#!/usr/bin/env python
import dateutil.relativedelta as relativedelta
import dateutil.rrule as rrule
import datetime
year=2010
before=datetime.datetime(year,1,1)
after=datetime.datetime(year,12,31)
rr = rrule.rrule(rrule.WEEKLY,byweekday=relativedelta.SU,dtstart=before)
print rr.between(before,after,inc=True)
Run Code Online (Sandbox Code Playgroud)
虽然如果没有dateutil,找到所有星期日并不难,但是这个模块非常方便,特别是如果你有更复杂或更多的日期计算.
如果您使用的是Debian/Ubuntu,则dateutil由python-dateutil包提供.
小智 5
您可以遍历该年的日历。下面应该返回给定年份的所有星期二和星期四。
# Returns all Tuesdays and Thursdays of a given year
from datetime import date
import calendar
year = 2016
c = calendar.TextCalendar(calendar.SUNDAY)
for m in range(1,13):
for i in c.itermonthdays(year,m):
if i != 0: #calendar constructs months with leading zeros (days belongng to the previous month)
day = date(year,m,i)
if day.weekday() == 1 or day.weekday() == 3: #if its Tuesday or Thursday
print "%s-%s-%s" % (year,m,i)
Run Code Online (Sandbox Code Playgroud)
如果寻找更通用的方法(即不仅是星期日),我们可以建立在sth的答案上:
def weeknum(dayname):
if dayname == 'Monday': return 0
if dayname == 'Tuesday': return 1
if dayname == 'Wednesday':return 2
if dayname == 'Thursday': return 3
if dayname == 'Friday': return 4
if dayname == 'Saturday': return 5
if dayname == 'Sunday': return 6
Run Code Online (Sandbox Code Playgroud)
这会将当天的名称转换为int.
然后做:
从日期时间导入日期,时间增量
def alldays(year, whichDayYouWant):
d = date(year, 1, 1)
d += timedelta(days = (weeknum(whichDayYouWant) - d.weekday()) % 7)
while d.year == year:
yield d
d += timedelta(days = 7)
for d in alldays(2020,'Sunday'):
print(d)
Run Code Online (Sandbox Code Playgroud)
注意% 7in的存在alldays()。这输出:
2020-01-05
2020-01-12
2020-01-19
2020-01-26
2020-02-02
2020-02-09
2020-02-16
...
Run Code Online (Sandbox Code Playgroud)
还可以这样做:
for d in alldays(2020,'Friday'):
print(d)
Run Code Online (Sandbox Code Playgroud)
这会给你:
2020-01-03
2020-01-10
2020-01-17
2020-01-24
2020-01-31
2020-02-07
2020-02-14
...
Run Code Online (Sandbox Code Playgroud)