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 เปลี่ยนการใช้งานหลัก สิ่งนี้ไม่สามารถใช้งานได้ย้อนหลังทั้งหมดและควรใช้ความระมัดระวังเมื่ออพยพไปดูการเปลี่ยนแปลงสำหรับคู่มือการย้ายถิ่น
ciso8601 เมื่อใด ciso8601 ไม่จำเป็นต้องเป็นทางออกที่ดีที่สุดสำหรับทุกกรณีการใช้งาน (โดยเฉพาะอย่างยิ่งตั้งแต่ Python 3.11) ดูฉันควรใช้ CISO8601 หรือไม่?
เริ่มต้นใน v2.0.0, ciso8601 เสนอการรับประกันที่แข็งแกร่งเมื่อพูดถึงสตริงการแยกวิเคราะห์
parse_datetime(dt: String): datetime เป็นฟังก์ชันที่ใช้สตริงและ::
ValueError ด้วยคำอธิบายของเหตุผลว่าทำไมสตริงไม่สอดคล้องกับชุดย่อยที่รองรับของ ISO 8601หากมีการให้ข้อมูลโซนเวลาจะส่งคืนวัตถุ 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 |
| odatetime | 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 |
| ซูลู | 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 |
| metomi-isodatetime | 828 USEC | 822 USEC | 791 USEC | 1.09 msec | 12781.0X | - | 1.1 msec | 1.11 msec |
| ช่วงเวลา | 1.28 msec | 1.32 msec | 1.29 msec | 1.36 msec | 19696.9X | - | 1.37 msec | 1.34 msec |
CISO8601 ใช้เวลา 64.8 NSEC ซึ่ง เร็วกว่า 2.3x (Builtin) , Python 3.13 ที่เร็วที่สุดต่อไปในการเปรียบเทียบนี้
แยกวิเคราะห์เวลาด้วยข้อมูลโซนเวลา (เช่น 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 |
| odatetime | 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 |
| ซูลู | 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 |
| metomi-isodatetime | 876 USEC | 823 USEC | 795 USEC | 1.09 msec | 11846.4X | - | 1.09 msec | 1.13 msec |
| ช่วงเวลา | 2070678.8X | - |
CISO8601 ใช้เวลา 73.9 NSEC ซึ่ง เร็วกว่า 2.8x (Builtin) , 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 เท่านั้น แต่รองรับ superset ของสิ่งที่ได้รับการสนับสนุนโดย 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 รองรับการใช้ตัวอักษร Hyphen-Minus (U+002D) เท่านั้น
สอดคล้องกับ RFC 3339, ciso8601 ยังช่วยให้สามารถใช้ z กรณีต่ำกว่าได้แทน Z
ciso8601 Parses ISO 8601 DateTimes ซึ่งสามารถคิดได้ว่าเป็น superset ของ 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 มันเร็วพอ ๆ กับ