ciso8601 Convierte ISO 8601 o RFC 3339 cadenas de fecha en objetos de fecha y hora de Python.
Dado que está escrito como un módulo C, es mucho más rápido que otras bibliotecas de Python. Probado con Cpython 2.7, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13.
(¿Interesado en trabajar en proyectos como este? Cerrar está buscando excelentes ingenieros para unirse a nuestro equipo)
Contenido
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 ) Versión 2.0.0 de ciso8601 cambió la implementación central. Esto no era completamente compatible con el revés, y se debe tener cuidado al migrar ver ChangeLog para la guía de migración.
ciso8601 ? ciso8601 no es necesariamente la mejor solución para cada caso de uso (especialmente desde Python 3.11). ¿Ves debería usar CISO8601?
A partir de V2.0.0, ciso8601 ofrece fuertes garantías cuando se trata de cuerdas de análisis.
parse_datetime(dt: String): datetime es una función que toma una cadena y cualquiera de los cuales:
ValueError con una descripción de la razón por la cual la cadena no se ajusta al subconjunto compatible de ISO 8601Si se proporciona información de la zona horaria, se devolverá un objeto de fecha y hora consciente. De lo contrario, se devuelve una ingenua fecha de fecha y hora.
Analización de una marca de tiempo sin información de zona horaria (por ejemplo, 2014-01-09T21:48:00 ):
| Módulo | Python 3.13 | Python 3.12 | Python 3.11 | Python 3.10 | Desaceleración relativa (versus CISO8601, último 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 (Builtin) | 147 nsec | 138 NSEC | 123 NSEC | N / A | 2.3x | … | N / A | N / A |
| péndulo | 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 |
| isodato | 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 |
| zulú | 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 |
| flecha | 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 |
| momento | 1.28 ms | 1.32 ms | 1.29 ms | 1.36 ms | 19696.9x | … | 1.37 ms | 1.34 ms |
CISO8601 toma 64.8 NSEC, que es 2.3x más rápido que el tiempo de fecha y hora (Builtin) , el próximo analizador Python 3.13 más rápido en esta comparación.
Analización de una marca de tiempo con información de la zona horaria (por ejemplo, 2014-01-09T21:48:00-05:30 ):
| Módulo | Python 3.13 | Python 3.12 | Python 3.11 | Python 3.10 | Desaceleración relativa (versus CISO8601, último 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 (Builtin) | 205 nsec | 198 NSEC | 178 NSEC | N / A | 2.8x | … | N / A | N / A |
| péndulo | 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 |
| isodato | 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 |
| zulú | 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 |
| flecha | 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 ms | 11846.4x | … | 1.09 ms | 1.13 ms |
| momento | 2070678.8x | … |
CISO8601 toma 73.9 NSEC, que es 2.8x más rápido que la hora de fecha (Builtin) , el próximo analizador de Python 3.13 más rápido en esta comparación.
Probado en Linux 6.11.5-Orbstack-00280-G96D99C92A42B usando los siguientes módulos:
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 . 1Para obtener detalles completos de la evaluación comparativa (o para ejecutar el punto de referencia usted mismo), consulte Benchmarking/Readme.RST
ciso8601 solo admite un subconjunto de ISO 8601, pero admite un superconjunto de lo que es compatible con Python ( datetime.fromisoformat ), y admite la totalidad de la especificación RFC 3339.
Se admiten los siguientes formatos de fecha:
| Formato | Ejemplo | Compatible |
|---|---|---|
YYYY-MM-DD (extendido) | 2018-04-29 | ✅ |
YYYY-MM (extendido) | 2018-04 | ✅ |
YYYYMMDD (básico) | 20180429 | ✅ |
YYYY-Www-D (fecha de la semana) | 2009-W01-1 | ✅ |
YYYY-Www (fecha de la semana) | 2009-W01 | ✅ |
YYYYWwwD (fecha de la semana) | 2009W011 | ✅ |
YYYYWww (fecha de la semana) | 2009W01 | ✅ |
YYYY-DDD (fecha ordinal) | 1981-095 | ✅ |
YYYYDDD (fecha ordinal) | 1981095 | ✅ |
Los formatos de fecha poco comunes ISO 8601 no son compatibles:
| Formato | Ejemplo | Compatible |
|---|---|---|
--MM-DD (año omitido) | --04-29 | |
--MMDD (año omitido) | --0429 | |
±YYYYY-MM (> 4 dígitos) | +10000-04 | |
+YYYY-MM (líder +) | +2018-04 | |
-YYYY-MM (negativo -) | -2018-04 |
Los tiempos son opcionales y se separan de la fecha por la letra T .
De acuerdo con RFC 3339, ciso8601 también permite que se use un carácter espacial o una t más bajo, en lugar de una T
Se admiten los siguientes formatos de tiempo:
| Formato | Ejemplo | Compatible |
|---|---|---|
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 | ✅ |
| Medianoche (caso especial) | 24:00:00 | ✅ |
hh.hhh (horas fraccionarias) | 11.5 | |
hh:mm.mmm (minutos fraccionales) | 11:30.5 |
Nota: Los objetos de DateTime de Python solo tienen precisión de microsegundos (6 dígitos). Cualquier precisión adicional se truncará.
La información de la zona horaria se puede proporcionar en uno de los siguientes formatos:
| Formato | Ejemplo | Compatible |
|---|---|---|
Z | Z | ✅ |
z | z | ✅ |
±hh | +11 | ✅ |
±hhmm | +1130 | ✅ |
±hh:mm | +11:30 | ✅ |
Mientras que la especificación ISO 8601 permite el uso de signo menos (U+2212) en el separador de la zona horaria, ciso8601 solo admite el uso del carácter de guión-minus (U+002d).
De acuerdo con RFC 3339, ciso8601 también permite que se use una z más baja en lugar en lugar de una Z
ciso8601 PARSES ISO 8601 Datos, que se puede considerar como un superconjunto de RFC 3339 (aproximadamente). En los casos en que es posible que desee un análisis estricto RFC 3339, ciso8601 ofrece un método parse_rfc3339 , que se comporta de manera similar a parse_datetime :
parse_rfc3339(dt: String): datetime es una función que toma una cadena y ya sea:
ValueError con una descripción de la razón por la cual la cadena no se ajusta a RFC 3339. Se necesita más tiempo para analizar las marcas de tiempo con información de la zona horaria, especialmente si no están en UTC. Sin embargo, hay momentos en los que no le importa la información de la zona horaria y desea producir datos ingenuos en su lugar. Por ejemplo, si está seguro de que su programa solo analizará las marcas de tiempo de una sola zona horaria, es posible que desee despojar la información de la zona horaria y solo generar dientes de datos ingenuos.
En estos casos limitados, se proporciona una segunda función. parse_datetime_as_naive ignorará cualquier información de zona horaria que encuentra y, como resultado, es más rápido para las marcas de tiempo que contienen información de zona horaria.
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 ) Nota: parse_datetime_as_naive solo es útil en el caso en que sus marcas de tiempo tienen información de zona horaria, pero desea ignorarla. Esto es algo inusual. Si sus marcas de tiempo no tienen información de zona horaria (es decir, son ingenuas), simplemente use parse_datetime . Es igual de rápido.