Новый модуль 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 — это не только те, о которых мы говорили выше. Если вам интересно, вы можете обратиться к официальному сайту, но это то, что обычно используется.