ciso8601 преобразует ISO 8601 или RFC 3339 Date Strings в объекты Python DateTime.
Поскольку он написан как модуль C, он намного быстрее, чем другие библиотеки Python. Протестировано с помощью CPYTHON 2.7, 3,4, 3,5, 3,6, 3,7, 3,8, 3,9, 3,10, 3,11, 3,12, 3,13.
(Заинтересован в работе над такими проектами? Закрыть ищет отличных инженеров, чтобы присоединиться к нашей команде)
Содержимое
ciso8601 ?% pip install ciso8601 In [ 1 ]: import ciso8601
In [ 2 ]: ciso8601 . parse_datetime ( '2014-12-05T12:30:45.123456-05:30' )
Out [ 2 ]: datetime . datetime ( 2014 , 12 , 5 , 12 , 30 , 45 , 123456 , tzinfo = pytz . FixedOffset ( 330 ))
In [ 3 ]: ciso8601 . parse_datetime ( '20141205T123045' )
Out [ 3 ]: datetime . datetime ( 2014 , 12 , 5 , 12 , 30 , 45 ) Версия 2.0.0 ciso8601 изменила основную реализацию. Это было не совсем назад, и при миграции следует соблюдать осторожность, см. См. Чанглог для руководства по миграции.
ciso8601 ? ciso8601 не обязательно является лучшим решением для каждого варианта использования (особенно после Python 3.11). Смотрите ли я использовать CISO8601?
Начиная с v2.0.0, ciso8601 предлагает сильные гарантии, когда дело доходит до строк.
parse_datetime(dt: String): datetime - это функция, которая принимает строку и либо:
ValueError с описанием причины, почему строка не соответствует поддерживаемому подмножеству ISO 8601Если предоставлена информация о часовом поясе, будет возвращен объект DateTime. В противном случае возвращается наивное дату.
Расположение временной метки без информации о часовом поясе (например, 2014-01-09T21:48:00 ):
| Модуль | Python 3.13 | Python 3.12 | Python 3.11 | Python 3.10 | Относительное замедление (против CISO8601, последний Python) | … | Python 3.9 | Python 3.8 |
|---|---|---|---|---|---|---|---|---|
| CISO8601 | 64,8 нсек | 62,8 нсек | 60,1 нсек | 91,7 нсек | N/a | … | 86 нсек | 92,9 нсек |
| backports.datetime_fromisoformat | N/a | N/a | N/a | 73,6 нсек | 0,8x | … | 70 нсек | 75,9 нсек |
| DateTime (встроенный) | 147 NSEC | 138 NSEC | 123 NSEC | N/a | 2.3x | … | N/a | N/a |
| маятник | 171 NSEC | 181 NSEC | 175 нсек | 214 NSEC | 2,6x | … | 179 нсек | 180 нсек |
| UdateTime | 542 нсек | 563 нсек | 525 нсек | 555 нсек | 8,4x | … | 551 нсек | 553 NSEC |
| str2date | 3.29 usec | 3.53 usec | 3.52 usec | 3.85 usec | 50,8x | … | 3.72 usec | 3.9 usec |
| iso8601utils | N/a | N/a | N/a | N/a | 56.9x | … | 4.89 usec | 4.89 usec |
| ISO8601 | 5.1 usec | 5.4 usec | 5.18 usec | 5.38 usec | 78.8x | … | 5.36 usec | 5.55 usec |
| изодат | 5.76 usec | 5.85 usec | 5.21 usec | 5.91 usec | 89,0x | … | 5.97 usec | 6.07 usec |
| Pyso8601 | 10 usec | 11,5 USEC | 7.99 usec | 10.9 usec | 155,0x | … | 9.83 usec | 9.81 usec |
| Aniso8601 | 12.1 usec | 12.5 USEC | 11.1 usec | 15.1 usec | 186.9x | … | 15.4 usec | 15.6 USEC |
| Зулу | 12.3 usec | 13.6 usec | 12.6 USEC | 14.2 usec | 189,4X | … | 14.5 usec | 14.2 usec |
| майя | 35,9 usec | N/a | 40.6 USEC | 46,7 USEC | 554,3X | … | 45.4 USEC | 46.3 usec |
| Python-Dateutil | 36.2 usec | 36,9 USEC | 36.1 usec | 44 usec | 558.5x | … | 46.4 usec | 45.2 usec |
| стрелка | 42,9 usec | 43,8 USEC | 41.2 usec | 48,8 USEC | 662,7X | … | 50,7 USEC | 50.1 usec |
| Metomi-Isodatetime | 828 USEC | 822 USEC | 791 USEC | 1,09 мс | 12781.0x | … | 1,1 мс | 1,11 мс |
| мгновенный | 1,28 мсек | 1,32 мс | 1,29 мс | 1,36 мс | 19696.9x | … | 1,37 мс | 1,34 мсек |
CISO8601 занимает 64,8 NSEC, что в 2,3 раза быстрее, чем DateTime (встроенный) , следующий самый быстрый анализатор Python 3.13 в этом сравнении.
Расположение временной метки с информацией о часовом поясе (например, 2014-01-09T21:48:00-05:30 ):
| Модуль | Python 3.13 | Python 3.12 | Python 3.11 | Python 3.10 | Относительное замедление (против CISO8601, последний Python) | … | Python 3.9 | Python 3.8 |
|---|---|---|---|---|---|---|---|---|
| CISO8601 | 73,9 нсек | 71 NSEC | 65,6 нсек | 97,5 нсек | N/a | … | 92,9 нсек | 96,6 нсек |
| backports.datetime_fromisoformat | N/a | N/a | N/a | 99,2 нсек | 1,0x | … | 93 NSEC | 99,4 нсек |
| DateTime (встроенный) | 205 нсек | 198 NSEC | 178 NSEC | N/a | 2.8x | … | N/a | N/a |
| маятник | 251 NSEC | 259 нсек | 251 NSEC | 262 NSEC | 3.4x | … | 264 NSEC | 264 NSEC |
| UdateTime | 684 нсек | 700 нсек | 646 нсек | 684 нсек | 9.3x | … | 688 нсек | 676 нсек |
| str2date | 5.95 usec | 4.34 usec | 4.11 usec | 4.58 usec | 80,5x | … | 4.6 usec | 4.82 usec |
| ISO8601 | 7.68 usec | 8.56 usec | 7.62 usec | 7.99 usec | 103,9X | … | 7.83 usec | 8.16 usec |
| изодат | 7.77 usec | 8.53 usec | 7.54 usec | 7.88 usec | 105,0x | … | 8.12 usec | 8.4 usec |
| iso8601utils | N/a | N/a | N/a | N/a | 152,2X | … | 14.1 usec | 14.6 usec |
| Зулу | 17,8 USEC | 16.9 usec | 15.7 USEC | 17.3 usec | 241.3x | … | 17.3 usec | 17.6 usec |
| Aniso8601 | 18 USEC | 18.7 USEC | 16.4 usec | 21,5 USEC | 243.1x | … | 22,5 USEC | 22,8 USEC |
| Pyso8601 | 18.3 usec | 16.6 usec | 14.3 usec | 15,8 USEC | 247.5x | … | 16.2 usec | 16.4 usec |
| майя | 46.2 usec | N/a | 41 usec | 47,5 USEC | 625.0x | … | 45.2 usec | 47 usec |
| Python-Dateutil | 47.1 usec | 48.2 usec | 47.1 usec | 57.3 usec | 636.5x | … | 60.4 usec | 58,9 USEC |
| стрелка | 57,7 USEC | 53,8 USEC | 50,8 USEC | 60.2 usec | 780.2x | … | 59,4 USEC | 60.1 usec |
| Metomi-Isodatetime | 876 USEC | 823 USEC | 795 usec | 1,09 мс | 11846.4x | … | 1,09 мс | 1,13 мс |
| мгновенный | 2070678.8x | … |
CISO8601 занимает 73,9 нсек, что в 2,8 раза быстрее, чем DateTime (Builtin) , следующий самый быстрый анализатор Python 3.13 в этом сравнении.
Протестировано на Linux 6.11.5-Orbstack-00280-G96D99C92A42B с использованием следующих модулей:
aniso8601 == 9.0 . 1
arrow == 1.3 . 0
backports . datetime_fromisoformat == 2.0 . 2
ciso8601 == 2.3 . 1
iso8601 == 2.1 . 0
iso8601utils == 0.1 . 2
isodate == 0.7 . 2
maya == 0.6 . 1
metomi - isodatetime == 1 ! 3.1 . 0
moment == 0.12 . 1
pendulum == 3.0 . 0
PySO8601 == 0.2 . 0
python - dateutil == 2.9 . 0. post0
str2date == 0.905
udatetime == 0.0 . 17
zulu == 2.0 . 1Для получения полной анализы (или для запуска теста самостоятельно) см. Benchmarking/readme.rst
ciso8601 поддерживает только подмножество ISO 8601, но поддерживает суперсет того, что поддерживается самим Python ( datetime.fromisoformat ) и поддерживает всю спецификацию RFC 3339.
Поддерживаются следующие форматы даты:
| Формат | Пример | Поддерживается |
|---|---|---|
YYYY-MM-DD (расширен) | 2018-04-29 | ✅ |
YYYY-MM (расширен) | 2018-04 | ✅ |
YYYYMMDD (базовый) | 20180429 | ✅ |
YYYY-Www-D (неделя) | 2009-W01-1 | ✅ |
YYYY-Www (неделя) | 2009-W01 | ✅ |
YYYYWwwD (неделя) | 2009W011 | ✅ |
YYYYWww (неделя) | 2009W01 | ✅ |
YYYY-DDD (обычная дата) | 1981-095 | ✅ |
YYYYDDD (обычная дата) | 1981095 | ✅ |
Необычные форматы даты ISO 8601 не поддерживаются:
| Формат | Пример | Поддерживается |
|---|---|---|
--MM-DD (пропущенный год) | --04-29 | |
--MMDD (пропущенный год) | --0429 | |
±YYYYY-MM (> 4 цифр) | +10000-04 | |
+YYYY-MM (ведущий +) | +2018-04 | |
-YYYY-MM (негатив -) | -2018-04 |
Времена необязательны и отделены от даты по букве T
В соответствии с RFC 3339, ciso8601 также позволяет использовать либо космический символ, либо более низкий случай t , а не T
Поддерживаются следующие форматы времени:
| Формат | Пример | Поддерживается |
|---|---|---|
hh | 11 | ✅ |
hhmm | 1130 | ✅ |
hh:mm | 11:30 | ✅ |
hhmmss | 113059 | ✅ |
hh:mm:ss | 11:30:59 | ✅ |
hhmmss.ssssss | 113059.123456 | ✅ |
hh:mm:ss.ssssss | 11:30:59.123456 | ✅ |
hhmmss,ssssss | 113059,123456 | ✅ |
hh:mm:ss,ssssss | 11:30:59,123456 | ✅ |
| Полночь (Специальный случай) | 24:00:00 | ✅ |
hh.hhh (дробные часы) | 11.5 | |
hh:mm.mmm (дробные минуты) | 11:30.5 |
Примечание. Объекты Python DateTime имеют только микросекундную точность (6 цифр). Любая дополнительная точность будет усечена.
Информация о часовом поясе может быть предоставлена в одном из следующих форматов:
| Формат | Пример | Поддерживается |
|---|---|---|
Z | Z | ✅ |
z | z | ✅ |
±hh | +11 | ✅ |
±hhmm | +1130 | ✅ |
±hh:mm | +11:30 | ✅ |
В то время как спецификация ISO 8601 позволяет использовать знак минус (U+2212) в сепараторе часового пояса, ciso8601 только поддерживает использование символа дефис-минуса (U+002D).
В соответствии с RFC 3339, ciso8601 также позволяет использовать z с более низким содержанием Z вместо Z
ciso8601 SANASES ISO 8601 DATETIMES, которые можно рассматривать как суперсет RFC 3339 (примерно). В тех случаях, когда вы можете захотеть строгого анализа RFC 3339, ciso8601 предлагает метод parse_rfc3339 , который ведет себя аналогично parse_datetime :
parse_rfc3339(dt: String): datetime - это функция, которая принимает строку, и либо:
ValueError с описанием причины, почему строка не соответствует RFC 3339. Требуется больше времени, чтобы проанализировать временные метки с информацией о часовом поясе, особенно если они не в UTC. Тем не менее, бывают случаи, когда вы не заботитесь о информации часового пояса, и вместо этого вы хотите создать наивные даты. Например, если вы уверены, что ваша программа будет анализировать только временные метки из одного часового пояса, вы можете лишить информацию о часовом поясе и вывести только наивные времена.
В этих ограниченных случаях есть вторая функция. parse_datetime_as_naive будет игнорировать любую информацию о часовом поясе, которую он находит, и, как следствие, быстрее для метков времени, содержащих информацию о часовом поясе.
In [ 1 ]: import ciso8601
In [ 2 ]: ciso8601 . parse_datetime_as_naive ( '2014-12-05T12:30:45.123456-05:30' )
Out [ 2 ]: datetime . datetime ( 2014 , 12 , 5 , 12 , 30 , 45 , 123456 ) ПРИМЕЧАНИЕ. parse_datetime_as_naive полезно только в случае, когда ваши временные метки имеют информацию о часовом поясе, но вы хотите игнорировать ее. Это несколько необычно. Если у ваших временных метков нет информации часового пояса (то есть наивно), просто используйте parse_datetime . Это так же быстро.