ciso8601 、ISO 8601またはRFC 3339日付の文字列を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でテストしました。
(このようなプロジェクトに取り組むことに興味がありますか?Closeは、私たちのチームに参加する素晴らしいエンジニアを探しています)
コンテンツ
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 )ciso8601のバージョン2.0.0は、コア実装を変更しました。これは完全に後方に互換性があるわけではなく、移動するときは移行ガイドのChangelogを参照するときは注意が必要です。
ciso8601を使用しないのはいつですか? ciso8601 、必ずしもすべてのユースケースに最適なソリューションではありません(特にPython 3.11以降)。 CISO8601を使用する必要がありますか?
v2.0.0から、 ciso8601 、弦の解析に関して強力な保証を提供します。
parse_datetime(dt: String): datetime文字列を取得する関数です。
ValueErrorを上げますタイムゾーン情報が提供されている場合、認識される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 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 |
| 振り子 | 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 |
| アイソデート | 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 |
| メトミオダテチム | 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には、この比較で次に速いPython 3.13パーサーであるDateTime(Builtin)よりも2.3倍高速な64.8 NSECが必要です。
タイムゾーン情報でタイムスタンプを解析する(例: 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 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 |
| 振り子 | 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 |
| アイソデート | 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 |
| メトミオダテチム | 876 USEC | 823 USEC | 795 USEC | 1.09ミリ秒 | 11846.4x | … | 1.09ミリ秒 | 1.13ミリ秒 |
| 一瞬 | 2070678.8x | … |
CISO8601は、この比較で次に速いPython 3.13パーサーであるDateTime(Builtin)よりも2.8倍速い73.9 NSECを取得します。
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完全なベンチマークの詳細(または自分でベンチマークを実行する)については、ベンチマーク/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を使用することもできます。
ciso8601 ISO 8601 DateTimesを解析します。これは、RFC 3339(ほぼ)のスーパーセットと考えることができます。厳密なRFC 3339解析が必要な場合には、 ciso8601 parse_rfc3339メソッドparse_datetime提供します。
parse_rfc3339(dt: String): datetime文字列を取得する関数です。
ValueErrorを上げます。 タイムスタンプをタイムゾーン情報で解析するには、特にUTCにない場合は時間がかかります。ただし、タイムゾーン情報を気にしない場合があり、代わりに素朴なデータタイムを作成したい場合があります。たとえば、プログラムがタイムスタンプを単一のタイムゾーンからのみ解析することを確信している場合は、タイムゾーン情報を削除し、素朴なデータタイムのみを出力することをお勧めします。
これらの限られたケースでは、2番目の関数が提供されています。 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使用するだけです。同じくらい速いです。