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 ) الإصدار 2.0.0 من ciso8601 غيرت التنفيذ الأساسي. لم يكن هذا متوافقًا تمامًا إلى الوراء ، ويجب توخي الحذر عند الترحيل لرؤية Changelog لدليل الترحيل.
ciso8601 ؟ ciso8601 ليس بالضرورة أفضل حل لكل حالة استخدام (خاصة وأن Python 3.11). انظر هل يجب أن أستخدم CISO8601؟
بدءًا من الإصدار 2.0.0 ، يوفر ciso8601 ضمانات قوية عندما يتعلق الأمر بسلاسل التحليل.
parse_datetime(dt: String): datetime هي وظيفة تأخذ سلسلة وإما:
ValueError مع وصف لسبب عدم توافق السلسلة مع المجموعة الفرعية المدعومة من ISO 8601إذا تم توفير معلومات المنطقة الزمنية ، فسيتم إرجاع كائن DateTime. خلاف ذلك ، يتم إرجاع DateTime الساذج.
تحليل الطابع الزمني مع عدم وجود معلومات زمنية للمنطقة (على سبيل المثال ، 2014-01-09T21:48:00 ):
| الوحدة النمطية | بيثون 3.13 | بيثون 3.12 | بيثون 3.11 | بيثون 3.10 | التباطؤ النسبي (مقابل CISO8601 ، أحدث بيثون) | ... | بيثون 3.9 | بيثون 3.8 |
|---|---|---|---|---|---|---|---|---|
| CISO8601 | 64.8 NSEC | 62.8 NSEC | 60.1 NSEC | 91.7 NSEC | ن/أ | ... | 86 NSEC | 92.9 NSEC |
| backports.datetime_fromisoformat | ن/أ | ن/أ | ن/أ | 73.6 NSEC | 0.8x | ... | 70 NSEC | 75.9 NSEC |
| DateTime (مصممة) | 147 NSEC | 138 NSEC | 123 NSEC | ن/أ | 2.3x | ... | ن/أ | ن/أ |
| البندول | 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 | ن/أ | ن/أ | ن/أ | ن/أ | 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 |
| زولو | 12.3 USEC | 13.6 USEC | 12.6 USEC | 14.2 USEC | 189.4x | ... | 14.5 USEC | 14.2 USEC |
| مايا | 35.9 USEC | ن/أ | 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 MSec | 12781.0x | ... | 1.1 مللي ثانية | 1.11 مللي ثانية |
| لحظة | 1.28 مللي ثانية | 1.32 MSec | 1.29 مللي ثانية | 1.36 مللي ثانية | 19696.9x | ... | 1.37 مللي ثانية | 1.34 MSec |
يستغرق CISO8601 64.8 NSEC ، وهو أسرع 2.3x من DateTime (Buildin) ، وأسرع محلل Python 3.13 في هذه المقارنة.
تحليل الطابع الزمني مع معلومات المنطقة الزمنية (على سبيل المثال ، 2014-01-09T21:48:00-05:30 ):
| الوحدة النمطية | بيثون 3.13 | بيثون 3.12 | بيثون 3.11 | بيثون 3.10 | التباطؤ النسبي (مقابل CISO8601 ، أحدث بيثون) | ... | بيثون 3.9 | بيثون 3.8 |
|---|---|---|---|---|---|---|---|---|
| CISO8601 | 73.9 NSEC | 71 NSEC | 65.6 NSEC | 97.5 NSEC | ن/أ | ... | 92.9 NSEC | 96.6 NSEC |
| backports.datetime_fromisoformat | ن/أ | ن/أ | ن/أ | 99.2 NSEC | 1.0x | ... | 93 NSEC | 99.4 NSEC |
| DateTime (مصممة) | 205 NSEC | 198 NSEC | 178 NSEC | ن/أ | 2.8x | ... | ن/أ | ن/أ |
| البندول | 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 | ن/أ | ن/أ | ن/أ | ن/أ | 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 | ن/أ | 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 MSec | 11846.4x | ... | 1.09 MSec | 1.13 مللي ثانية |
| لحظة | 2070678.8x | ... |
CISO8601 يستغرق 73.9 NSEC ، وهو أسرع 2.8x من DateTime (بنيت) ، وأسرع أسرع 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للاطلاع على تفاصيل القياس الكاملة (أو لتشغيل المؤشر بنفسك) ، راجع المعايير/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 (Leading +) | +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 فقط على دقة microsecond (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 مع وصف لسبب عدم توافق السلسلة مع 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 . إنه بنفس السرعة.