Использование 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']
}
Ключ словаря в этом примере был бы недельным числом.
Beware! Если вы хотите определить ВАШЕ ОТНОШЕНИЕ НОМЕРА НЕДЕЛИ, вы можете использовать генератор выражения, предоставленного в вашем первом вопросе, который, кстати, получил потрясающий ответ). Если вы хотите следовать конвенции 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 содержит словарь, который вы запрашиваете.
Как определить недели? Здесь я определяю по дню недели, используя функцию, которая получает воскресенье той недели (то, что вы использовали в своем примере), а затем возвращает его плюс следующие 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']
Можно использовать модуль даты. Вы можете указать формат и все остальное. Вот ссылка: 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
Вот код:
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']
}
Если вы согласны со стандартом 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"!- )
Модули calendar позволяют установить любой день недели как "первый день недели", но не предлагают никакого простого способа получить все недели (без дублирования, когда неделя разделена на два месяца), поэтому я думаю, что работать непосредственно с datetime, вероятно, лучше.
.