Python понедельник этой недели

В 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.

Читайте также:  Public keyword in php

Как отмечено в комментарии 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

  • Получить ссылку
  • Facebook
  • Twitter
  • Pinterest
  • Электронная почта
  • Другие приложения

Сегодня посмотрим на 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” не являются верными с точки зрения соблюдения стандартов. Я рекомендую всякий раз, когда вам предоставляется выбор, форматировать даты именно в международном стандарте. Так вы сможете избежать некоторых проблем. связанных с совместимостью вашего кода.

Заключение

  1. combine()
  2. timedelta
  3. Преобразование в timestamp
  4. weekday()/isoweekday()
  5. Строчное форматирование

Источник

Оцените статью