ciso8601 convertit ISO 8601 ou RFC 3339 Temps de date de date en objets Python DateTime.
Puisqu'il est écrit comme un module C, il est beaucoup plus rapide que les autres bibliothèques Python. Testé avec Cpython 2.7, 3.4, 3,5, 3,6, 3,7, 3,8, 3,9, 3.10, 3.11, 3.12, 3.13.
(Intéressé à travailler sur des projets comme celui-ci? Close est à la recherche de grands ingénieurs pour rejoindre notre équipe)
Contenu
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 ) La version 2.0.0 de ciso8601 a modifié l'implémentation de base. Cela n'était pas entièrement compatible en arrière et des soins doivent être pris en migration, voir Changelog pour le guide de migration.
ciso8601 ? ciso8601 n'est pas nécessairement la meilleure solution pour chaque cas d'utilisation (en particulier depuis Python 3.11). Voir Dois-je utiliser CISO8601?
À partir de la v2.0.0, ciso8601 offre de fortes garanties en ce qui concerne l'analyse des chaînes.
parse_datetime(dt: String): datetime est une fonction qui prend une chaîne et soit:
ValueError avec une description de la raison pour laquelle la chaîne ne est pas conforme au sous-ensemble pris en charge de l'ISO 8601Si des informations de fuseau horaire sont fournies, un objet DateTime conscient sera renvoyé. Sinon, une datetime naïve est renvoyée.
Analyse d'un horodatage sans informations de fuseau horaire (par exemple, 2014-01-09T21:48:00 ):
| Module | Python 3.13 | Python 3.12 | Python 3.11 | Python 3.10 | Ralentissement relatif (contre Ciso8601, dernier 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 (intégré) | 147 NSEC | 138 NSEC | 123 NSEC | N / A | 2.3x | … | N / A | N / A |
| pendule | 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 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 |
| isodate | 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 |
| zoulou | 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-dateutil | 36.2 USEC | 36.9 USEC | 36.1 USEC | 44 USEC | 558,5x | … | 46.4 USEC | 45.2 USEC |
| flèche | 42.9 USEC | 43.8 USEC | 41.2 USEC | 48.8 USEC | 662.7x | … | 50,7 USEC | 50.1 USEC |
| métomi-isodatetime | 828 USEC | 822 USEC | 791 USEC | 1,09 msec | 12781.0x | … | 1,1 msec | 1,11 msec |
| moment | 1,28 msec | 1,32 msec | 1,29 msec | 1,36 msec | 19696.9x | … | 1,37 msec | 1,34 msec |
CISO8601 prend 64,8 NSEC, qui est 2,3x plus rapide que DateTime (intégré) , le prochain analyseur Python 3.13 le plus rapide dans cette comparaison.
Analyse d'un horodatage avec des informations de fuseau horaire (par exemple, 2014-01-09T21:48:00-05:30 ):
| Module | Python 3.13 | Python 3.12 | Python 3.11 | Python 3.10 | Ralentissement relatif (contre Ciso8601, dernier 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 (intégré) | 205 NSEC | 198 NSEC | 178 NSEC | N / A | 2,8x | … | N / A | N / A |
| pendule | 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 |
| isodate | 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 |
| zoulou | 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 |
| Maya | 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 |
| flèche | 57.7 USEC | 53.8 USEC | 50,8 USEC | 60.2 USEC | 780,2x | … | 59.4 USEC | 60.1 USEC |
| métomi-isodatetime | 876 USEC | 823 USEC | 795 USEC | 1,09 msec | 11846.4x | … | 1,09 msec | 1,13 msec |
| moment | 2070678.8X | … |
CISO8601 prend 73,9 NSEC, qui est 2,8x plus rapide que DateTime (intégré) , le prochain analyseur Python 3.13 le plus rapide dans cette comparaison.
Testé sur Linux 6.11.5-Orbstack-00280-G96D99C92A42B en utilisant les modules suivants:
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 . 1Pour les détails complets de l'analyse comparative (ou pour exécuter le benchmark vous-même), consultez l'analyse comparative / Readme.rst
ciso8601 ne prend en charge qu'un sous-ensemble d'ISO 8601, mais prend en charge un superset de ce qui est pris en charge par Python lui-même ( datetime.fromisoformat ), et prend en charge l'intégralité de la spécification RFC 3339.
Les formats de date suivants sont pris en charge:
| Format | Exemple | Soutenu |
|---|---|---|
YYYY-MM-DD (étendu) | 2018-04-29 | ✅ |
YYYY-MM (étendu) | 2018-04 | ✅ |
YYYYMMDD (basique) | 20180429 | ✅ |
YYYY-Www-D (date de semaine) | 2009-W01-1 | ✅ |
YYYY-Www (date de la semaine) | 2009-W01 | ✅ |
YYYYWwwD (date de semaine) | 2009W011 | ✅ |
YYYYWww (date de la semaine) | 2009W01 | ✅ |
YYYY-DDD (date ordinale) | 1981-095 | ✅ |
YYYYDDD (date ordinale) | 1981095 | ✅ |
Les formats de date ISO 8601 peu communs ne sont pas pris en charge:
| Format | Exemple | Soutenu |
|---|---|---|
--MM-DD (année omise) | --04-29 | |
--MMDD (année omise) | --0429 | |
±YYYYY-MM (> 4 chiffres) | +10000-04 | |
+YYYY-MM (leader +) | +2018-04 | |
-YYYY-MM (négatif -) | -2018-04 |
Les temps sont facultatifs et sont séparés de la date par la lettre T .
Conformément à RFC 3339, ciso8601 permet également à un caractère d'espace, soit à un cas inférieur, d'être utilisé à la place d' T t
Les formats de temps suivants sont pris en charge:
| Format | Exemple | Soutenu |
|---|---|---|
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 | ✅ |
| Minuit (cas spécial) | 24:00:00 | ✅ |
hh.hhh (heures fractionnées) | 11.5 | |
hh:mm.mmm (minutes fractionnaires) | 11:30.5 |
Remarque: les objets Python DateTime ont uniquement une précision en microseconde (6 chiffres). Toute précision supplémentaire sera tronquée.
Des informations de fuseau horaire peuvent être fournies dans l'un des formats suivants:
| Format | Exemple | Soutenu |
|---|---|---|
Z | Z | ✅ |
z | z | ✅ |
±hh | +11 | ✅ |
±hhmm | +1130 | ✅ |
±hh:mm | +11:30 | ✅ |
Alors que la spécification ISO 8601 permet d'utiliser un signe moins (U + 2212) dans le séparateur de fuseau horaire, ciso8601 ne prend en charge que l'utilisation du caractère trait d'union (U + 002D).
Conformément à RFC 3339, ciso8601 permet également à un Z-Case z d'être utilisé à la place d'un Z .
ciso8601 Parses ISO 8601 DateTimes, qui peut être considéré comme un superset de RFC 3339 (à peu près). Dans les cas où vous voudrez peut-être l'analyse stricte RFC 3339, ciso8601 propose une méthode parse_rfc3339 , qui se comporte de manière similaire à parse_datetime :
parse_rfc3339(dt: String): datetime est une fonction qui prend une chaîne et soit:
ValueError avec une description de la raison pour laquelle la chaîne n'est pas conforme à RFC 3339. Il faut plus de temps pour analyser les horodatages avec les informations de fuseau horaire, surtout s'ils ne sont pas en UTC. Cependant, il y a des moments où vous ne vous souciez pas des informations de fuseau horaire et souhaitez produire des DateTimes naïfs à la place. Par exemple, si vous êtes certain que votre programme analysera les horodatages à partir d'un seul fuseau horaire, vous voudrez peut-être supprimer les informations de fuseau horaire et ne sortir que les données naïves.
Dans ces cas limités, une deuxième fonction est fournie. parse_datetime_as_naive ignorera toutes les informations de fuseau horaire qu'elle trouve et, par conséquent, est plus rapide pour les horodatage contenant des informations de fuseau horaire.
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 ) Remarque: parse_datetime_as_naive n'est utile que dans le cas où vos horodatages ont des informations de fuseau horaire, mais vous souhaitez l'ignorer. C'est quelque peu inhabituel. Si vos horodatages n'ont pas d'informations de fuseau horaire (c'est-à-dire naïves), utilisez simplement parse_datetime . C'est tout aussi rapide.