Python: дайте дані про початок і кінець тижня з заданої дати


77
day = "13/Oct/2013"
print("Parsing :",day)
day, mon, yr= day.split("/")
sday = yr+" "+day+" "+mon
myday = time.strptime(sday, '%Y %d %b')
Sstart = yr+" "+time.strftime("%U",myday )+" 0"
Send = yr+" "+time.strftime("%U",myday )+" 6"
startweek = time.strptime(Sstart, '%Y %U %w')
endweek = time.strptime(Send, '%Y %U %w')
print("Start of week:",time.strftime("%a, %d %b %Y",startweek))
print("End of week:",time.strftime("%a, %d %b %Y",endweek))
print("Data entered:",time.strftime("%a, %d %b %Y",myday))

out:
Parsing : 13/Oct/2013
Start of week: Sun, 13 Oct 2013
End of week: Sat, 19 Oct 2013
Sun, 13 Oct 2013

Вивчив python за останні 2 дні і цікавився, чи існує більш чистий спосіб зробити це.Цей метод працює ... це просто виглядає потворно, і здається безглуздим створювати нову змінну часу для кожної дати, і що там бути способом компенсувати дану дату до початку та кінця тижня за допомогою простого дзвінка, але я не зміг знайти нічого в Інтернеті чи документації, яка, схоже, могла б спрацювати.


1
Це не є критикою програмування, але я ніколи не бачив, щоб хтось писав дату на зразок "13 / жовтня / 2013". Ви впевнені, що саме так ви хочете проаналізувати введення?
Бріоній

@Brionius Я не знаю, звідки береться OP, але тут, у моїй країні, цей формат досить поширений (і, можливо, навіть найпоширеніший).
Гіперборей

3
Га - як цікаво. Я ніколи не бачив нечислових відрізків у позначеннях на основі косої риски.
Бріоній

Відповіді:


179

Використовуйте datetimeмодуль.

Це дасть початок і кінець тижня (з понеділка по неділю):

from datetime import datetime, timedelta

day = '12/Oct/2013'
dt = datetime.strptime(day, '%d/%b/%Y')
start = dt - timedelta(days=dt.weekday())
end = start + timedelta(days=6)
print(start)
print(end)

РЕДАГУВАТИ:

print(start.strftime('%d/%b/%Y'))
print(end.strftime('%d/%b/%Y'))

2
- це початок і кінець об’єкта datetime, або це рядок. Мені потрібно відформатувати вихідні дані, як моє першоджерельне запитання, і я спробував використати datetime.strftime ("% a,% d% b% Y", end), однак там говорилося, що end є жалом, а не об'єктом datetime.
shadowtdt09

1
Дякуємо за допомогу, останнє запитання, чи є спосіб змінити початок тижня на неділю замість понеділка?
shadowtdt09

17
Просто перемістіть будній день на один день. Щось подібне start = dt - timedelta(days = (dt.weekday() + 1) % 7)мало би спрацювати.
Гіперборей

як можуть працювати додавання і віднімання, якщо в день є також складова часу? Щось на зразок day = '12/10/2013 13:43:43'?
Vineet Menon

1
@SaravananNandhan переконайтеся, що ви імпортуєте datetime з datetime, а не тільки datetime. Так from datetime import datetimeі НЕimport datetime
guival

30

Невеликі варіації, якщо ви хочете зберегти стандартне форматування часу та звернутися до поточного дня:

from datetime import datetime, timedelta

today = datetime.now().date()
start = today - timedelta(days=today.weekday())
end = start + timedelta(days=6)
print("Today: " + str(today))
print("Start: " + str(start))
print("End: " + str(end))

19

Використовуйте маятниковий модуль:

today = pendulum.now()
start = today.start_of('week')
end = today.end_of('week')

це саме те, що мені потрібно
Raveen Beemsingh

1
... це саме те, що вам потрібно, поки ваш тиждень починається і закінчується у неділю ввечері. Маятник, мабуть, не може встановити кінець тижня як суботу о 23:59:59.
Аарон К. де

4
Про маятник я дізнався сьогодні. Згідно з його документами , справжній # ISO8601 тиждень починається в понеділок і закінчується в неділю. Було б ганьбою, якщо цього не можна змінити. Після деяких пошуків я знайшов це . Отже, якщо ви додасте pendulum.week_starts_at(pendulum.SUNDAY)і pendulum.week_ends_at(pendulum.SATURDAY), ви зможете отримати правильні дати, використовуючи методи start_of()and end_of(). Я не впевнений, чи це такий шлях, але, здається, це працює в моїх тестах.
k427h1c

1

Ви також можете використовувати Arrow:

import arrow
now = arrow.now()
start_of_week = now.floor('week')
end_of_week = now.ceil('week')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.