Как я могу получить текущую неделю с помощью Python?
Использование 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']
}
Ключ словаря в этом примере будет номером недели.
Ответы
Ответ 1
Осторожно! Если вы хотите определить ВАШИ СОБСТВЕННЫЕ номера недели, вы можете использовать выражение генератора, предоставленное в своем первом вопросе, которое, кстати, получило удивительный ответ). Если вы хотите следовать стандарту 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 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 содержит словарь, который вы запрашиваете.
Ответ 2
Как вы определяете недели? Здесь я идентифицируюсь через день на этой неделе, используя функцию, которая получает воскресенье на этой неделе (то, что вы использовали в вашем примере), а затем возвращает ее и следующие 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']
Ответ 3
Вы можете использовать модуль 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
Ответ 4
Если вы в порядке со стандартом 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']
но вы можете настроить его, смоделировав соответствующую ошибку "от одного"!)
Модули calendar позволяют установить любой день недели как "первый день недели", но не предлагают простой способ получить все недели (без дублирования, когда неделя делится между двумя месяцами), поэтому я думаю, что работа с datetime, вероятно, является лучшей идеей.
Ответ 5
Вот код:
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']
}
Ответ 6
Существует 3-строчный метод, который я разработал после того, как прочитал этот вопрос:
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)
, чтобы получить текущие даты недели.
Ответ 7
current_week = datetime.datetime.now().isocalendar()[1]