19


9

Pythonを使用して1年間のすべての日曜日を選択するにはどうすればよいですか?

Pythonの使用…​

1年ですべての日曜日(またはその場合は任意の日)を選択するにはどうすればよいですか?

[ '01/03/2010','01/10/2010','01/17/2010','01/24/2010', ...]

これらの日付は、2010年の日曜日を表します。 これは、私が推測する曜日にも当てはまります。

6 Answer


41


http://docs.python.org/library/datetime.html [datetime]モジュールの` date`を使用して、1年の最初の日曜日を検索し、7日追加して新しい日曜日を生成できます。

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)


6


dateutil moduleを使用して、この方法でリストを生成できます。

#!/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)

dateutilなしですべての日曜日を見つけることはそれほど難しくありませんが、特に複雑な、またはさまざまな日付計算がある場合、このモジュールは便利です。

Debian / Ubuntuを使用している場合、dateutilはpython-dateutilパッケージによって提供されます。


4


その年のカレンダーを繰り返すことができます。 以下は、特定の年のすべての火曜日と木曜日を返します。

# 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)


2


Pandasは、https://pandas.pydata.org/pandas-docs/stable/generated/pandas.date_range.html [date_range]関数を使用して、この目的のための優れた機能を備えています。

結果はパンダの `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']


2


リスト内包表記の使用:

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]


1


@sthのソリューションを基にした完全なジェネレーター関数を次に示します。 彼のソリューションのコメントで言及された重要な修正が含まれています。

曜日(Pythonのインデックス作成に0 = Mondayから6 = Sundayを使用)、開始日、および列挙する週数を指定できます。

def get_all_dates_of_day_of_week_in_year(day_of_week, start_year, start_month,
                                         start_day, max_weeks=None):
    '''
    Generator function to enumerate all calendar dates for a specific day
    of the week during one year. For example, all Wednesdays in 2018 are:
    1/3/2018, 1/10/2018, 1/17/2018, 1/24/2018, 1/31/2018, 2/7/2018, etc.

    Parameters:
    ----------
    day_of_week : int
        The day_of_week should be one of these values: 0=Monday, 1=Tuesday,
        2=Wednesday, 3=Thursday, 4=Friday, 5=Saturday, 6=Sunday.
    start_year : int
    start_month : int
    start_day : int
        The starting date from which to list out all the dates
    max_weeks : int or None
        If None, then list out all dates for the rest of the year.
        Otherwise, end the list after max_weeks number of weeks.
    '''

    if day_of_week < 0 or day_of_week > 6:
        raise ValueError('day_of_week should be in [0, 6]')

    date_iter = date(start_year, start_month, start_day)

    # First desired day_of_week
    date_iter += timedelta(days=(day_of_week - date_iter.weekday() + 7) % 7)
    week = 1
    while date_iter.year == start_year:
        yield date_iter
        date_iter += timedelta(days=7)
        if max_weeks is not None:
            week += 1
            if week > max_weeks:
                break

2018年1月1日から10週間すべての水曜日を取得する使用例。

import calendar
day_of_week = 2
max_weeks = 10
for d in get_all_dates_of_day_of_week_in_year (day_of_week, 2018, 1, 1, max_weeks):
    print "%s, %d/%d/%d" % (calendar.day_name[d.weekday()], d.year, d.month, d.day)

上記のコードは以下を生成します。

Wednesday, 2018/1/3
Wednesday, 2018/1/10
Wednesday, 2018/1/17
Wednesday, 2018/1/24
Wednesday, 2018/1/31
Wednesday, 2018/2/7
Wednesday, 2018/2/14
Wednesday, 2018/2/21
Wednesday, 2018/2/28
Wednesday, 2018/3/7