Как я могу получить текущую неделю, используя Python? - PullRequest
11 голосов
/ 05 января 2010

Использование Python ...

Как я могу получить список дней в конкретной неделе?

Что-то вроде ...

{
'1' : ['01/03/2010','01/04/2010','01/05/2010','01/06/2010','01/07/2010','01/08/2010','01/09/2010'],  
'2' : ['01/10/2010','01/11/2010','01/12/2010','01/13/2010','01/14/2010','01/15/2010','01/16/2010'] 
}

Ключом словаря в этом примере будет номер недели.

Ответы [ 7 ]

17 голосов
/ 05 января 2010

Осторожно! Если вы хотите определить ВАШИ СОБСТВЕННЫЕ номера недель, вы можете использовать выражение генератора, предоставленное в вашем первом вопросе , который, кстати, получил отличный ответ) Если вы хотите следовать правилам ISO для номеров недель, вам нужно быть осторожным:

первая календарная неделя года тот, который включает в себя первый Четверг того года и [...] последняя календарная неделя календарного года неделя, непосредственно предшествующая первая календарная неделя следующей календарный год.

Так, например, 1 и 2 января 2010 года были НЕ первой неделей 2010 года , а 53-й неделей 2009 года.

Python предлагает модуль для поиска номера недели с помощью календаря ISO:

Пример кода:

h[1] >>> import datetime
h[1] >>> Jan1st = datetime.date(2010,1,1)
h[1] >>> Year,WeekNum,DOW = Jan1st.isocalendar() # DOW = day of week
h[1] >>> print Year,WeekNum,DOW
2009 53 5

Обратите внимание, опять же, как 1 января 2010 года соответствует 53-й неделе 2009 года.

Использование генератора, указанного в предыдущем ответе:

from datetime import date, timedelta


def allsundays(year):
    """This code was provided in the previous answer! It's not mine!"""
    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)

Dict = {}
for wn,d in enumerate(allsundays(2010)):
    # This is my only contribution!
    Dict[wn+1] = [(d + timedelta(days=k)).isoformat() for k in range(0,7) ]

print Dict

Dict содержит запрашиваемый вами словарь.

5 голосов
/ 05 января 2010

Как вы определяете недели? Здесь я определяю по дню на этой неделе, используя функцию, которая получает воскресенье на этой неделе (то, что вы использовали в вашем примере), а затем возвращает его плюс следующие 6 дней.

import datetime

one_day = datetime.timedelta(days=1)

def get_week(date):
  """Return the full week (Sunday first) of the week containing the given date.

  'date' may be a datetime or date instance (the same type is returned).
  """
  day_idx = (date.weekday() + 1) % 7  # turn sunday into 0, monday into 1, etc.
  sunday = date - datetime.timedelta(days=day_idx)
  date = sunday
  for n in xrange(7):
    yield date
    date += one_day

print list(get_week(datetime.datetime.now().date()))
# [datetime.date(2010, 1, 3), datetime.date(2010, 1, 4),
#  datetime.date(2010, 1, 5), datetime.date(2010, 1, 6),
#  datetime.date(2010, 1, 7), datetime.date(2010, 1, 8),
#  datetime.date(2010, 1, 9)]
print [d.isoformat() for d in get_week(datetime.datetime.now().date())]
# ['2010-01-03', '2010-01-04', '2010-01-05', '2010-01-06', '2010-01-07',
#  '2010-01-08', '2010-01-09']
1 голос
/ 16 января 2015

Существует метод с тремя строками, который я разработал после прочтения этого вопроса:

from datetime import timedelta

def get_week_dates(base_date, start_day, end_day=None):
    """
    Return entire week of dates based on given date limited by start_day and end_day.
    If end_day is None, return only start_day.

    >>> from datetime import date
    >>> get_week_dates(date(2015,1,16), 3, 5)
    [datetime.date(2015, 1, 14), datetime.date(2015, 1, 15), datetime.date(2015, 1, 16)]

    >>> get_week_dates(date(2015,1,15), 2, 5)
    [datetime.date(2015, 1, 13), datetime.date(2015, 1, 14), datetime.date(2015, 1, 15), datetime.date(2015, 1, 16)]
    """
    monday = base_date - timedelta(days=base_date.isoweekday() - 1)
    week_dates = [monday + timedelta(days=i) for i in range(7)]
    return week_dates[start_day - 1:end_day or start_day]

Используйте get_week_dates(date.today(), 1, 7), чтобы получить даты текущей недели.

1 голос
/ 05 января 2010

Если вы согласны со стандартом ISO:

>>> import collections
>>> dd = collections.defaultdict(list)
>>> jan1 = datetime.date(2010, 1, 1)
>>> oneday = datetime.timedelta(days=1)
>>> allyear = [jan1 + k*oneday for k in range(365 + 6)]
>>> for d in allyear:
...   y, w, wd = d.isocalendar()
...   if y == 2010: dd[w].append(d.strftime('%m/%d/%Y'))
... 

Это дает несколько отличные результаты от результатов, которые вы ищете (по стандарту ISO недели начинаются в понедельник, а не в воскресенье ...), например ::

>>> dd[1]
['01/04/2010', '01/05/2010', '01/06/2010', '01/07/01/2010', '01/08/2010', '01/09/2010', '01/10/2010']

но вы можете настроить это, имитируя соответствующую ошибку "off by one"! -)

Модули календаря позволяют установить любой день недели как «первый день недели», но не предлагают простого способа получить все недели (без дублирования, когда неделя делится на два месяца), поэтому я думаю, что лучше работать напрямую с datetime .

1 голос
/ 05 января 2010

Вы можете использовать модуль datetime. Вы можете указать формат и все. Вот ссылка: http://docs.python.org/library/datetime.html

Просмотрите datetime.datetime (params) и datetime.timedelta (params). Надеюсь, что все идет хорошо; -)

Пример:

import datetime

numweeks = 5
start_date = datetime.datetime(year=2010,month=1,day=4)    

weeks = {}

offset = datetime.timedelta(days=0)
for week in range(numweeks):
   this_week = []
   for day in range(7):
        date = start_date + offset
        date = date.strftime( some_format_string )
        this_week.append( date )
        offset += datetime.timedelta(days=1)
   weeks[week] = this_week 
0 голосов
/ 23 июня 2017
current_week = datetime.datetime.now().isocalendar()[1]
0 голосов
/ 05 января 2010

Вот код:

import datetime

now = datetime.datetime.now()

now_day_1 = now - datetime.timedelta(days=now.weekday())

dates = {}

for n_week in range(3):
    dates[n_week] = [(now_day_1 + datetime.timedelta(days=d+n_week*7)).strftime("%m/%d/%Y") for d in range(7)]

print dates

печать:

{
 0: ['01/04/2010', '01/05/2010', '01/06/2010', '01/07/2010', '01/08/2010', '01/09/2010', '01/10/2010'], 
 1: ['01/11/2010', '01/12/2010', '01/13/2010', '01/14/2010', '01/15/2010', '01/16/2010', '01/17/2010'], 
 2: ['01/18/2010', '01/19/2010', '01/20/2010', '01/21/2010', '01/22/2010', '01/23/2010', '01/24/2010']
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...