Новый модуль datetime в Python
Что касается обработки данных, Python предоставляет множество библиотек, таких как стандартная библиотека datetime
, сторонние библиотеки dateutil
, arrow
и так далее.
В этой статье я хотел бы представить мою личную любимую библиотеку pendulum
, которая очень удобна в использовании и может выполнять любые операции с датами.
Почему маятник?
Нативных экземпляров datetime
достаточно для базовых случаев, но когда вы сталкиваетесь с более сложными вариантами использования, они часто имеют ограничения и не так интуитивно понятны в работе. Pendulum
предоставляет более чистый и простой в использовании API, в то же время опираясь на стандартную библиотеку. Так что это все еще datetime
, но лучше.
В отличие от других
datetime
библиотек для Python, Pendulum является заменой стандартного классаdatetime
(он наследуется от него), поэтому, по сути, вы можете заменить все своиdatetime
экземплярыDateTime
экземплярами в своем коде (исключения существуют для библиотек, которые проверяют тип объектов с помощью функцииtype
, например,sqlite3
илиPyMySQL
).
Это также устраняет понятие наивного datetimes
: каждый экземпляр Pendulum
учитывает часовой пояс и по умолчанию находится в UTC
для простоты использования.
Pendulum
также улучшает стандартный класс timedelta
, предоставляя более интуитивно понятные методы и свойства.
Монтаж
Вам нужно установить его перед использованием, просто установите маятник напрямую.
$ pip install pendulum Looking in indexes: https://pypi.python.org/simple Collecting pendulum Downloading pendulum-2.1.2.tar.gz (81 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.2/81.2 kB 4.1 MB/s eta 0:00:00 Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done ... Successfully installed pendulum-2.1.2 pytzdata-2020.1
Основное использование
Давайте посмотрим на использование, первое — это создание datetime, date, time.
import pendulum dt = pendulum.datetime( 2022, 7, 21, 20, 10, 30) print(dt.__class__) print(dt) """ <class 'pendulum.datetime.DateTime'> 2022-07-21T20:10:30+00:00 """ # Change timezone dt = pendulum.datetime( 2022, 7, 21, 20, 10, 30, tz="xxxx/xxxx") print(dt) """ 2022-07-21T20:10:30+08:00 """ # Create date d = pendulum.date(2022, 7, 21) print(d.__class__) print(d) """ <class 'pendulum.date.Date'> 2022-07-21 """ # Create time t = pendulum.time(20, 10, 30) print(t.__class__) print(t) """ <class 'pendulum.time.Time'> 20:10:30 """
Если создается datetime
, часовой пояс по умолчанию равен UTC. Если вам не нужен часовой пояс или вы хотите, чтобы часовой пояс был местным часовым поясом, тогда pendulum
также предоставляет два специальных метода.
import pendulum # Create datetime use local timezone dt = pendulum.local( 2022, 7, 21, 20, 10, 30) print(dt) """ 2022-07-21T20:10:30+08:00 """ print(pendulum.local_timezone()) """ Timezone('xxxx/xxxx') """ # Create datetime with no timezon # tz is None dt = pendulum.naive(2022, 7, 21, 20, 10, 30) print(dt) """ 2022-07-21T20:10:30 """
Затем pendulum
также предоставляет несколько методов, таких как создание текущей даты и времени, даты и так далее.
import pendulum dt = pendulum.today() print(dt) """ 2022-07-21T00:00:00+08:00 """ # Get tomorrow's date dt = pendulum.tomorrow() print(dt) """ 2022-07-22T00:00:00+08:00 """ # Get yesterday's date dt = pendulum.yesterday() print(dt) """ 2022-07-20T00:00:00+08:00 """
Мы также можем создать из временных меток или строк:
import pendulum # Based on given timestamp dt1 = pendulum.from_timestamp(1653828466) dt2 = pendulum.from_timestamp(1653828466, tz=pendulum.local_timezone()) print(dt1) print(dt2) """ 2022-05-29T12:47:46+00:00 2022-05-29T20:47:46+08:00 """ # Based on time string dt1 = pendulum.parse("2020-05-03 12:11:33") dt2 = pendulum.parse("2020-05-03 12:11:33", tz=pendulum.local_timezone()) print(dt1) print(dt2) """ 2020-05-03T12:11:33+00:00 2020-05-03T12:11:33+08:00 """
Операции, связанные с датой и временем
Операций много, будем вводить их одну за другой.
import pendulum dt = pendulum.local( 2022, 3, 28, 20, 10, 30) # Get date and time print(dt.date()) print(dt.time()) """ 2022-07-21 20:10:30 """ # Replace and return new datetime print(dt.replace(year=9999)) """ 9999-03-28T20:10:30+08:00 """ # Convert to timestamp print(dt.timestamp()) """ 1648469430.0 """ # Return year, month, day... print(dt.year, dt.month, dt.day) print(dt.hour, dt.minute, dt.second) print(dt.tz) """ 2022 3 28 20 10 30 Timezone('xxx/xxxx') """
Затем сгенерируйте строки, pendulum.DateTime
объекты могут быть преобразованы в строки даты в различных форматах.
import pendulum dt = pendulum.local( 2022, 3, 28, 20, 10, 30) # Most frequent uses print("datetime:", dt.to_datetime_string()) print("date:", dt.to_date_string()) print("time:", dt.to_time_string()) print("iso8601:", dt.to_iso8601_string()) """ datetime: 2022-03-28 20:10:30 date: 2022-03-28 time: 20:10:30 iso8601: 2022-03-28T20:10:30+08:00 """ print("atom:", dt.to_atom_string()) print("rss:", dt.to_rss_string()) print("w3c:", dt.to_w3c_string()) print("cookie:", dt.to_cookie_string()) print("rfc822:", dt.to_rfc822_string()) """ atom: 2022-03-28T20:10:30+08:00 rss: Mon, 28 Mar 2022 20:10:30 +0800 w3c: 2022-03-28T20:10:30+08:00 rfc822: Mon, 28 Mar 22 20:10:30 +0800 """
Иногда нам также нужно определить текущую дату как день недели, текущий год как день и так далее, pendulum
также упаковал это для нас.
import pendulum dt = pendulum.local( 2022, 3, 28, 20, 10, 30) # Return days of week print(dt.isoweekday()) # 1 # Return days of year print(dt.day_of_year) # 87 # Return days of month print(dt.days_in_month) # 31 # Return week of month print(dt.week_of_month) # 5 # Return week of year print(dt.week_of_year) # 13 # Check leap year print(dt.is_leap_year()) # False
Последнее — это операция с датой, которая является самой мощной частью pendulum
.
import pendulum dt = pendulum.local( 2022, 7, 21, 20, 10, 30) # Return next month today print(dt.add(months=1)) """ 2022-08-21T20:10:30+08:00 """ # Return last month today print(dt.add(months=-1)) """ 2022-06-21T20:10:30+08:00 """
Как и встроенный модуль Python datetime
, при добавлении дат он поддерживает до дней, и мы не можем вычислить дату следующей недели, следующего месяца и следующего года. С pendulum
можно легко обращаться, и это мой любимый момент.
Конечно, значение в add положительное, что эквивалентно дате, идущей назад; значение отрицательное, что эквивалентно сдвигу даты вперед.
Тогда две даты тоже можно вычесть:
import pendulum dt1 = pendulum.local( 2021, 1, 20, 11, 22, 33) dt2 = pendulum.local( 2022, 3, 30, 20, 10, 30) period = dt2 - dt1 # Return Period object # Similar to timedelta in datetime print(period.__class__) """ <class 'pendulum.period.Period'> """ print(period.in_years()) # 1 print(period.in_months()) # 14 print(period.in_weeks()) # 62 print(period.in_days()) # 434 print(period.in_hours()) # 10424 print(period.in_minutes()) # 625487 print(period.in_seconds()) # 37529277
Функция очень мощная. timedelta
в модуле Python datetime
может вычислять только максимальное количество дней разницы между двумя датами, и здесь можно использовать год, месяц, день, час, минуту и секунду.
Конечно, функции pendulum
— это не только те, о которых мы говорили выше. Если вам интересно, вы можете обратиться к официальному сайту, но это то, что обычно используется.