ciso8601 wandelt ISO 8601 oder RFC 3339 Datumszeitzeichenfolgen in Python DateTime -Objekte um.
Da es als C -Modul geschrieben ist, ist es viel schneller als andere Python -Bibliotheken. Getestet mit cpython 2.7, 3,4, 3,5, 3,6, 3,7, 3,8, 3,9, 3,10, 3,11, 3,12, 3,13.
(Interessiert, an solchen Projekten zu arbeiten? Close sucht nach großartigen Ingenieuren, die sich unserem Team anschließen können.)
Inhalt
ciso8601 nicht verwenden?% 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 ) Version 2.0.0 von ciso8601 veränderte die Kernimplementierung. Dies war nicht vollständig nach hinten kompatibel, und es sollte darauf geachtet werden, dass der Migrationshandbuch Migration aufsieht.
ciso8601 nicht verwenden? ciso8601 ist nicht unbedingt die beste Lösung für jeden Anwendungsfall (zumal Python 3.11). Sehen Sie, sollte ich ciso8601 verwenden?
Ab V2.0.0 bietet ciso8601 starke Garantien für die Parsen von Saiten.
parse_datetime(dt: String): datetime ist eine Funktion, die eine Zeichenfolge übernimmt und entweder:
ValueError mit einer Beschreibung des Grundes, warum die Zeichenfolge nicht der unterstützten Teilmenge von ISO 8601 entsprichtWenn Zeitzoneninformationen bereitgestellt werden, wird ein wachsames DateTime -Objekt zurückgegeben. Andernfalls wird eine naive DateTime zurückgegeben.
Analyse eines Zeitstempels ohne Zeitzoneninformationen (z. B. 2014-01-09T21:48:00 ):
| Modul | Python 3.13 | Python 3.12 | Python 3.11 | Python 3.10 | Relative Verlangsamung (gegen CISO8601, neueste Python) | … | Python 3.9 | Python 3.8 |
|---|---|---|---|---|---|---|---|---|
| CISO8601 | 64.8 NSEC | 62.8 NSEC | 60.1 NSEC | 91.7 NSEC | N / A | … | 86 NSEC | 92.9 NSEC |
| backports.datetime_fromisoformat | N / A | N / A | N / A | 73.6 NSEC | 0,8x | … | 70 nSec | 75.9 NSEC |
| DateTime (integriert) | 147 NSEC | 138 NSEC | 123 NSEC | N / A | 2.3x | … | N / A | N / A |
| Pendel | 171 NSEC | 181 NSEC | 175 NSEC | 214 nSec | 2.6x | … | 179 NSEC | 180 nSec |
| Udatetime | 542 NSEC | 563 NSEC | 525 NSEC | 555 NSEC | 8.4x | … | 551 NSEC | 553 NSEC |
| Str2date | 3.29 usec | 3.53 Usc | 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 USAc | 5.4 usec | 5.18 usec | 5.38 usec | 78,8x | … | 5.36 usec | 5.55 usec |
| Isodat | 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 |
| Zulu | 12.3 Usec | 13.6 Usec | 12.6 Usec | 14.2 Usec | 189,4x | … | 14.5 Usec | 14.2 Usec |
| Maya | 35.9 Usec | N / A | 40.6 Usec | 46.7 Usec | 554.3x | … | 45.4 usec | 46.3 Usec |
| Python-datutil | 36.2 Usec | 36.9 Usec | 36.1 Usec | 44 usec | 558,5x | … | 46.4 Usec | 45.2 Usec |
| Pfeil | 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 ms | 12781.0x | … | 1,1 ms | 1.11 ms |
| Moment | 1,28 ms | 1,32 ms | 1,29 ms | 1,36 ms | 19696.9x | … | 1,37 ms | 1,34 ms |
CISO8601 nimmt 64,8 NSEC, was 2,3 x schneller als DateTime (integriert) ist, dem nächstschnellsten Python 3.13 -Parser in diesem Vergleich.
Analyse eines Zeitstempels mit Zeitzoneninformationen (z. B. 2014-01-09T21:48:00-05:30 ):
| Modul | Python 3.13 | Python 3.12 | Python 3.11 | Python 3.10 | Relative Verlangsamung (gegen CISO8601, neueste Python) | … | Python 3.9 | Python 3.8 |
|---|---|---|---|---|---|---|---|---|
| CISO8601 | 73.9 NSEC | 71 NSEC | 65.6 NSEC | 97,5 NSEC | N / A | … | 92.9 NSEC | 96.6 NSEC |
| backports.datetime_fromisoformat | N / A | N / A | N / A | 99.2 NSEC | 1.0x | … | 93 NSEC | 99.4 NSEC |
| DateTime (integriert) | 205 NSEC | 198 NSEC | 178 NSEC | N / A | 2.8x | … | N / A | N / A |
| Pendel | 251 NSEC | 259 NSEC | 251 NSEC | 262 NSEC | 3.4x | … | 264 NSEC | 264 NSEC |
| Udatetime | 684 NSEC | 700 NSEC | 646 NSEC | 684 NSEC | 9.3x | … | 688 NSEC | 676 NSEC |
| 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 |
| Isodat | 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 |
| Zulu | 17.8 Usec | 16.9 Usec | 15.7 Usec | 17.3 Usec | 241.3x | … | 17.3 Usec | 17.6 Usec |
| Aniso8601 | 18 USAc | 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 |
| Maya | 46.2 Usec | N / A | 41 usec | 47.5 Usec | 625.0x | … | 45.2 Usec | 47 usec |
| Python-datutil | 47.1 usec | 48.2 Usec | 47.1 usec | 57.3 Usec | 636,5x | … | 60.4 Usec | 58.9 Usec |
| Pfeil | 57.7 Usec | 53.8 usec | 50.8 Usec | 60.2 Usec | 780,2x | … | 59.4 Usec | 60.1 USAc |
| metomi-isodatetime | 876 Usec | 823 Usec | 795 Usec | 1,09 ms | 11846.4x | … | 1,09 ms | 1,13 ms |
| Moment | 2070678.8x | … |
CISO8601 dauert 73,9 NSEC, was 2,8x schneller ist als DateTime (integriert) , der nächstschnellste Python 3.13 -Parser in diesem Vergleich.
Getestet unter Linux 6.11.5-Orbstack-00280-G96D99C92A42B unter Verwendung der folgenden Module:
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 . 1Informationen zum vollständigen Benchmarking -Details (oder um den Benchmark selbst auszuführen) finden Sie unter Benchmarking/Readme.rst
ciso8601 unterstützt nur eine Teilmenge von ISO 8601, unterstützt jedoch eine Übersicht über das, was von Python selbst unterstützt wird ( datetime.fromisoformat ) und unterstützt die Gesamtheit der RFC 3339 -Spezifikation.
Die folgenden Datumsformate werden unterstützt:
| Format | Beispiel | Unterstützt |
|---|---|---|
YYYY-MM-DD (erweitert) | 2018-04-29 | ✅ |
YYYY-MM (erweitert) | 2018-04 | ✅ |
YYYYMMDD (Basic) | 20180429 | ✅ |
YYYY-Www-D (Woche Datum) | 2009-W01-1 | ✅ |
YYYY-Www (Woche Datum) | 2009-W01 | ✅ |
YYYYWwwD (Woche Datum) | 2009W011 | ✅ |
YYYYWww (Woche Datum) | 2009W01 | ✅ |
YYYY-DDD (Ordnungsdatum) | 1981-095 | ✅ |
YYYYDDD (Ordnungsdatum) | 1981095 | ✅ |
Ungewöhnliche ISO 8601 -Datumsformate werden nicht unterstützt:
| Format | Beispiel | Unterstützt |
|---|---|---|
--MM-DD (ausgelassenes Jahr) | --04-29 | |
--MMDD (ausgelassenes Jahr) | --0429 | |
±YYYYY-MM (> 4 Ziffernjahr) | +10000-04 | |
+YYYY-MM (führend +) | +2018-04 | |
-YYYY-MM (negativ -) | -2018-04 |
Zeiten sind optional und werden vom Datum durch den Buchstaben T getrennt.
In Übereinstimmung mit RFC 3339 kann ciso8601 auch entweder ein Raumschiff oder ein niedrigerer t anstelle eines T verwendet werden.
Die folgenden Zeitformate werden unterstützt:
| Format | Beispiel | Unterstützt |
|---|---|---|
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 | ✅ |
| Mitternacht (Sonderfall) | 24:00:00 | ✅ |
hh.hhh (Bruchstunden) | 11.5 | |
hh:mm.mmm (Bruchminuten) | 11:30.5 |
HINWEIS: Python DateTime -Objekte haben nur eine mikrosekundige Genauigkeit (6 Ziffern). Jede zusätzliche Präzision wird abgeschnitten.
Zeitzoneninformationen können in einem der folgenden Formate bereitgestellt werden:
| Format | Beispiel | Unterstützt |
|---|---|---|
Z | Z | ✅ |
z | z | ✅ |
±hh | +11 | ✅ |
±hhmm | +1130 | ✅ |
±hh:mm | +11:30 | ✅ |
Während die ISO 8601-Spezifikation die Verwendung von Minus-Zeichen (U+2212) im Zeitzonenabscheider ermöglicht, unterstützt ciso8601 nur die Verwendung des Hyphen-Minus-Zeichens (U+002D).
In Übereinstimmung mit RFC 3339 ermöglicht ciso8601 auch ein niedrigerer Fall z anstelle eines Z .
ciso8601 analysiert ISO 8601 DateTimes, die (ungefähr) als Superset von RFC 3339 betrachtet werden können. In Fällen, in denen Sie strenge RFC 3339 -Parsen wünschen, bietet ciso8601 eine parse_rfc3339 -Methode, die sich auf ähnliche Weise wie parse_datetime verhält:
parse_rfc3339(dt: String): datetime ist eine Funktion, die eine Zeichenfolge übernimmt und entweder:
ValueError mit einer Beschreibung des Grundes, warum die Zeichenfolge RFC 3339 nicht entspricht. Es dauert mehr Zeit, um Zeitstempel mit Zeitzoneninformationen zu analysieren, insbesondere wenn sie nicht in UTC sind. Es gibt jedoch Zeiten, in denen Sie sich nicht um Zeitzoneninformationen kümmern und stattdessen naive Angreiferimate erstellen möchten. Wenn Sie beispielsweise sicher sind, dass Ihr Programm nur Zeitstempel aus einer einzigen Zeitzone analysiert, möchten Sie möglicherweise die Zeitzoneninformationen entfernen und nur naive Angaben ausgeben.
In diesen begrenzten Fällen wird eine zweite Funktion bereitgestellt. parse_datetime_as_naive ignoriert alle fundierenden Zeitzoneninformationen und ist infolgedessen schneller für Zeitstempel, die Zeitzoneninformationen enthalten.
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 ) Hinweis: parse_datetime_as_naive ist nur für den Fall nützlich, in dem Ihre Zeitstempel Zeitzoneninformationen haben, aber Sie ignorieren möchten. Dies ist etwas ungewöhnlich. Wenn Ihre Zeitstempel keine Zeitzoneninformationen haben (dh naiv sind), verwenden Sie einfach parse_datetime . Es ist genauso schnell.