В Python, как найти дату первого понедельника данной недели?
Предполагая, что первый день вашей недели — понедельник, используйте %U вместо %W , если первый день вашей недели — воскресенье. Подробнее см. Документацию для strptime.
Обновление: Исправлен номер недели. Директива %W основана на 0, так что неделя 51 будет введена как 50, а не 51.
Обратите внимание, что эта функция не работает правильно с isocalendar (). Например, первая неделя 2013 года начинается 31 декабря (что правильно), но 2012-1 начинается с 26 декабря (что должно быть 2 января). Это вызвано тем, что% W использует собственную реализацию номеров недель, а isocalendar () использует стандарт ISO. Используйте метод Вайдаса ниже для более точного метода.
Решения PEZ и Gerald Kaszuba работают в предположении, что 1 января всегда будет в первую неделю данного года. Это предположение неверно для ISO-календаря, см. Документы Python для справки. Например, в календаре ISO 1 неделя 2010 года начинается с 4 января, а 1 января 2010 года — на 53 неделе 2009 года. Решение, совместимое с календарем ISO:
from datetime import date, timedelta def week_start_date(year, week): d = date(year, 1, 1) delta_days = d.isoweekday() - 1 delta_weeks = week if year == d.isocalendar()[0]: delta_weeks -= 1 delta = timedelta(days=-delta_days, weeks=delta_weeks) return d + delta
Согласно этому списку , 3 сентября (день, когда ваш комментарий был опубликован) было на 36-й неделе 2013 года в календаре ISO. week_start_date(2013,36) возвращает 2013-09-02.
Как отмечено в комментарии ralphje к принятому ответу,% W использует собственную реализацию номеров недель, а не стандарт ISO. Также обратите внимание, что% W основан на 0.
from datetime import date, timedelta def first_monday(year, week): d = date(year, 1, 4) # The Jan 4th must be in week 1 according to ISO return d + timedelta(weeks=(week-1), days=-d.weekday())
хорошо работает, если вам нужно определить начало текущей недели — используйте datetime.datetime.now (). isocalendar () [1], чтобы определить текущую неделю года
Это, похоже, работает, если неделя может быть в понедельник падала на день в прошлом году.
from datetime import date, timedelta def get_first_dow(year, week): d = date(year, 1, 1) d = d - timedelta(d.weekday()) dlt = timedelta(days = (week - 1) * 7) return d + dlt
Я немного изменил script Vaidas K. таким образом, что он вернет начало недели и конец дня недели.
from datetime import datetime, date, timedelta def weekbegend(year, week): """ Calcul du premier et du dernier jour de la semaine ISO """ d = date(year, 1, 1) delta_days = d.isoweekday() - 1 delta_weeks = week if year == d.isocalendar()[0]: delta_weeks -= 1 # delta for the beginning of the week delta = timedelta(days=-delta_days, weeks=delta_weeks) weekbeg = d + delta # delta2 for the end of the week delta2 = timedelta(days=6-delta_days, weeks=delta_weeks) weekend = d + delta2 return weekbeg, weekend
Soyou может использовать его таким образом.
weekbeg, weekend = weekbegend(2009, 1) begweek = weekbeg.strftime("%A %d %B %Y") endweek = weekend.strftime("%A %d %B %Y")
Используйте форматирование строк, найденное в модуле времени. Подробное объяснение используемых форматов
>>> import time >>> time.strptime("51 08 1","%U %y %w") (2008, 12, 22, 0, 0, 0, 0, 357, -1)
Дата возврата отключена на одну неделю в соответствии с календарем на моем компьютере, возможно, это потому, что недели индексируются с 0?
Ещё вопросы
- 0 C ++, как объединить, объединить, пересечь два объекта Vector в новый третий объект?
- 0 Не могу опросить SQL в Angular
- 0 json из js в php — не удалось открыть поток: сбой http-запроса
- 1 JMX. Можно ли сделать вложенные MBeans?
- 1 Общие методы приводят это к T
- 0 ошибка: my_texture не называет тип
- 0 Утечки памяти в C ++ из-за статической переменной [duplicate]
- 0 SDL_Surface отказывается от блиц
- 0 Как отобразить ответ из базы данных на представление codeigniter в формате строки
- 0 php @ Azure Веб-сайт: не могу написать в% TMP%
- 0 Почему Angular не может найти мой контроллер?
- 0 ошибка загрузки изображения с классом php и curl
- 0 Преобразовать выбранную строку в JSON — PHP
- 0 передача данных модели прицела в контроллер
- 1 Не удалось загрузить файл или сборку в приложении WP8.1
- 1 Одновременная запись нескольких переменных в Pandas
- 1 Счетчик времени Vue.js
- 0 Safari 100% DIV оставляет место на правой стороне
- 0 Как работать с аргументами в Xcode
- 1 Преобразование поэтажных планов в иерархические графики
- 1 Как читать файлы с FTP без скачивания их?
- 1 Как конфертировать из ICollection в IEnumerable?
- 0 Запретить отправку, даже если произошла ошибка
- 1 При загрузке изображения с использованием XmlHttpRequest я получаю эту ошибку
- 0 Как провести модульное тестирование следующей функции в жасмине?
- 0 указать порядок полей в сообщении FIX, используя QuickFIX
- 0 AngularJS объем этого в фабрике
- 0 Динамическая страница в угловом маршруте
- 1 Установка десятичного значения в форме не всегда работает — Dynamics CRM 2013
- 0 в чем разница между empty () и $ _POST [«name»] == «»; в php?
- 0 Несоответствие строк при вызове ajax в WebApi
- 0 Href (переход на локацию на той же странице) не работает в сочетании с отображением скрытого div
- 1 тип безопасности (mypy) для параметров функции при использовании * args
- 1 вернуться в исходное состояние при снятии флажка
- 1 Как сохранить urwid. Редактировать всегда в фокусе?
- 1 Генерация пары ключей RSA на стороне клиента в приложении Google Web Toolkit через Google App Engine с библиотекой gwt-crypto
- 1 Facebook DotNetOpenAuth Получен неожиданный ответ на авторизацию OAuth
- 1 Использование HttpResponseMessage для просмотра ошибок
- 0 Использование db.Find, когда есть составные первичные ключи и вы хотите использовать только один
- 0 Как отправить список элементов с помощью ajax и jquery и как извлечь данные из него в сценарии perl, чтобы его можно было добавить в базу данных
- 0 Получить элементы списка в массив
- 0 Как запустить функцию непосредственно перед отправкой формы?
- 1 Как я могу приносить информацию из ElasticSearch в пакетном режиме, если она находится на многих уровнях?
- 1 xna c # перехватить и отменить кнопку закрытия окна (x) и Ctrl F4
- 0 Центрировать элемент Div на странице?
- 0 Не удается сбросить форму с помощью ‘$ setPristine’
- 0 php array_rand многомерное значение
- 1 Не удается установить заголовки после их отправки. (ошибка nodejs)
- 0 Даже после autoplay = «false» preload = «none», видео запускается без нажатия кнопки воспроизведения
Lets Analyse it!
Блог Владимира Степанова об аналитике. Публикую свои подходы и кейсы по анализу данных, визуализации и работе с дата-инструментами.
5 приемов при работе с модулем datetime в Python
- Получить ссылку
- Электронная почта
- Другие приложения
Сегодня посмотрим на Python-библиотеку datetime — незаменимый набор инструментов для обработки данных с датой и временем. Я дам обзор пяти основных приемов этой библиотеки, которые закроют большинство ваших проблем при обработки дат и времени. Поехали!
Понимание что такое объект datetime в Python.
Прежде чем приступить к разбору самих приемов полезно посмотреть, как устроены дата и время в datetime. Основным строительным блоком является объект datetime. И вполне логично, что это комбинация объекта даты и объекта времени (привет, кэп Очевидность!) Объект даты — это просто набор значений года, месяца, дня плюс набор функций, которые умеют их обрабатывать. Аналогичным образом устроен объект времени. Он включает значения часа, минут, секунд, микросекунд и часового пояса. Любое время может быть представлено соответствующим выбором этих значений.
1. combine()
import datetime
# (часы, минуты)
start_time = datetime.time(20, 0)
# (год, месяц, день)
# Создаем объект datetimet
start_datetime = datetime.datetime.combine(start_date, start_time)
Первый прием при работе с датами — это возможность создавать их, комбинируя объекты даты и времени. В коде выше мы начинаем с создания времени, передавая ему значения в 20 часов и 0 минут. Поскольку мы не указали секунду или микросекунду, предполагается, что они равны нулю. Затем мы создаем дату, передавая год, месяц и день. Имеем 1 июня 2020 года
Создать объект datetime просто. Мы используем функцию comb () и передаем ей объект date и объект time, из которых мы хотим построить наше datetime.
Из-за похода к неймингу вызов функций пакета datetime могут сбивать с толку. Во-первых, datetime — это имя самой библиотеки(или еще называют пакета). Во-вторых datetime — это также имя модуля внутри пакета и, в-третьих, datetime — это уже тип самого объекта. Поэтому, когда мы объединяем нашу дату и время, мы вызываем его с таким задвоенным префиксом datetime.datetime. Первое datetime ссылается на пакет, второе datetime ссылается на модуль, а comb () — это функция внутри этого модуля.
2. timedelta
# Разница между datetimes -это объекты типа timedelta
timedelta_total = end_datetime — start_datetime
# timedelta состоят из дней, секунд и микросекунд
end_datetime = start_datetime + timedelta_total
Второй прием для работы с датами — это тип, называемый timedelta. Он представляет собой разницу между двумя датами. Timedelta имеет всего три значения: дни, секунды и микросекунды. Таким образом можно однозначно представить разницу между любыми двумя датами.
Объекты c типом timedelta невероятно полезны, потому что они позволяют нам выполнять простую арифметику сложения и вычитания с датами. Они избавляют нас от необходимости думать о таких вещах, как количество дней в месяце, сколько секунд в дне или в високосном годе.
3. Timestamps
# Число секунд с 12:00 час. 1-го Января 1970, UTC
unix_time = timestamp(start_datetime)
start_datetime = fromtimestamp(1457453760)
Третий прием для максимально эффективного использования даты — использование меток времени (timestamps). Для компьютеров работать с днями, часами, минутами и секундами неудобно. Чтобы упростить работу с датами и временем, было создано понятие UNIX-времени. Это количество секунд, прошедших с 00:00 1 января 1970 г. по всемирному координированному времени (часовой пояс UTC +0). Это позволяет представить любую дату и время одним, обычно интерпретируемым числом с плавающей запятой. Единственный недостаток в том, что он не интуитивно понятен человеку. Функции timestamp () и fromtimestamp () позволяют преобразовывать наш понятный человеком объект datetime в UNIX-timestamp и обратно для простоты вычислений.
4. weekday () и isoweekday ()
# Выводит порядковый номер дня недели
# Понедельник — 0, Воскресенье — 6
weekday_number = start_datetime.date().weekday()
Наш четвертый прием — это функция weekday (). Для любой даты вычисляется день недели. Чтобы использовать его, вызовите функцию date () в объекте datetime. Это изолирует объект даты и игнорирует его временную часть. А затем вызовите его функцию weekday (). Она возвращает число от 0 до 6, где ноль — понедельник, один — вторник и т.д., а шесть — воскресенье. Если вам нужна более человеческая нумерация дней недели, где 1-это понедельник, а 7 — это воскресенье, то используйте функцию isoweekday () — она вернет порядковый номер дня недели в более привычной нотации
5. Преобразование в строчный формат
# Переводит строку в объект datetime
new_datetime = datetime.datetime.strptime(
‘2020-07-31’, ‘%Y-%m-%d’)
# И обратно — из datetime в строку
datestr = new_datetime.strftime(‘%Y-%m-%d’)
print(datestr)
Последний на сегодня прием, который заключается в преобразовании даты в строку и обратно. Это бывает полезно, когда мы получаем данные из текстового файла и хотим переделать текстовые даты в объекты datetime. А также и обратно, когда нужно показать наш объект datetime пользователю или экспортировать его в текстовый файл.
Для этого мы будем использовать функции strptime () и strftime (). При преобразовании в любом направлении мы должны предоставить некий шаблон, определяющий формат конечного результата. В фрагменте кода выше «% Y» представляет год, «% m» — месяц из двух цифр, а «% d» — день из двух цифр. Вот еще список значений для шаблона:
%A — полное название дня недели(Понедельник, Вторник)
%B — полное название месяца (Январь, Февраль)
%H — часы в 24-х часовом формате
%y — последний две цифры года(18, 19, 20)
Полный список кодов форматирования можно найти по этой ссылке
Кстати, на самом деле существует один правильный способ представления лет, месяцев и дней в датах: «ГГГГ-ММ-ДД». (Международный стандарт ISO 8601 установил это в 1988 г.) В этом формате, например, 31 июля 2020 г. будет «2020-07-31». Поэтому, ни российский вариант “31.07.2020”, ни американский вариант “07.31.2020” не являются верными с точки зрения соблюдения стандартов. Я рекомендую всякий раз, когда вам предоставляется выбор, форматировать даты именно в международном стандарте. Так вы сможете избежать некоторых проблем. связанных с совместимостью вашего кода.
Заключение
- combine()
- timedelta
- Преобразование в timestamp
- weekday()/isoweekday()
- Строчное форматирование