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 객체가 반환됩니다. 그렇지 않으면 순진한 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 | 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 (내장) | 147 NSEC | 138 NSEC | 123 NSEC | N/A | 2.3 배 | … | N/A | N/A |
| 흔들리는 추 | 171 NSEC | 181 NSEC | 175 NSEC | 214 NSEC | 2.6 배 | … | 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 |
| metomi-isodateTime | 828 USEC | 822 USEC | 791 USEC | 1.09msec | 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를 사용하며,이 비교에서 다음으로 가장 빠른 Python 3.13 파서 인 DateTime (내장)보다 2.3 배 빠릅니다 .
시간대 정보로 타임 스탬프를 구문 분석 (예 : 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 | 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 (내장) | 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.2 배 | … | 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.09msec | 11846.4x | … | 1.09msec | 1.13 MSEC |
| 순간 | 2070678.8x | … |
CISO8601은 73.9 NSEC를 사용하며,이 비교에서 다음으로 가장 빠른 Python 3.13 파서 인 DateTime (내장)보다 2.8 배 빠릅니다 .
다음 모듈을 사용하여 Linux 6.11.5-Obstack-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에 있지 않은 경우. 그러나 시간대 정보를 신경 쓰지 않고 순진한 데이터 시간을 대신 생산하고자하는 경우가 있습니다. 예를 들어, 프로그램이 단일 시간대에서 타임 스탬프 만 구문 분석 할 것이라고 확신하는 경우 시간대 정보를 제거하고 순진한 데이터 시간 만 출력 할 수 있습니다.
이러한 제한된 경우에는 두 번째 기능이 제공됩니다. 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 사용하십시오. 마찬가지로 빠릅니다.