python: pywintyptes.datetime을 datetime.datetime으로 변환합니다.
저는 pywin32를 사용하여 엑셀 파일을 읽고 쓰는 중입니다.xyyy-mm-dd hh:mm:ss 형식으로 저장된 Excel 날짜가 있습니다.저는 그것들을 datetime.datetime 객체로 Python으로 가져오고 싶습니다.다음은 제가 시작한 코드 라인입니다.
prior_datetime = datetime.strptime(excel_ws.Cells(2, 4).Value, '%Y-%m-%d %H:%M:%S')
그게 안 먹혔어.오류가 발생했습니다.
strptime() argument 1 must be str, not pywintypes.datetime
저는 그것을 끈에 던져 보았습니다.
prior_datetime = datetime.strptime(str(excel_ws.Cells(2, 4).Value), '%Y-%m-%d %H:%M:%S')
그것도 효과가 없었습니다.오류가 발생했습니다.
ValueError: unconverted data remains: +00:00
그래서 저는 조금 다른 것을 시도했습니다.
prior_datetime = datetime.fromtimestamp(int(excel_ws.Cells(2, 4).Value))
여전히 운이 없습니다.오류:
TypeError: a float is required.
부유물에 캐스팅하는 것은 도움이 되지 않았습니다.정수가 아닙니다.(이봐요, 저는 이 시점에서 필사적이었어요.)
잘못된 곳을 찾고 있을 수도 있지만, 일반적으로 pywin32, 특히 pywintype 또는 pywintype.datetime에 대한 좋은 문서를 찾는 데 어려움을 겪고 있습니다.
도와드릴까요?
그래서 문제는+00:00
표준 시간대 오프셋.Python을 위한 즉각적인 솔루션은 없습니다.
datetime.datetime.strptime("2016-04-01 17:29:25+00:00", '%Y-%m-%d %H:%M:%S %z')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/_strptime.py", line 324, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'
한 가지 반창고 해결책은 시간대를 없애는 것이지만, 그것은 꽤 징그럽게 느껴집니다.
datetime.datetime.strptime("2016-04-01 17:29:25+00:00".rstrip("+00:00"), '%Y-%m-%d %H:%M:%S')
datetime.datetime(2016, 4, 1, 17, 29, 25)
둘러보면 다음과 같습니다(타사 라이브러리를 사용할 수 있는 경우).dateutil
이 문제를 해결하고 사용하는 것이 더 좋습니다.datetime.strptime
.
온라인 명령줄
pip install python-dateutil
코드
>>> import dateutil.parser
>>> dateutil.parser.parse("2016-04-01 17:29:25+00:00")
datetime.datetime(2016, 4, 1, 17, 29, 25, tzinfo=tzutc())
제 생각에 당신은 그들과 꽤 친했던 것 같습니다.datetime.datetime.fromtimestamp
이러한 접근 방식을 통해 고객의 비즈니스 환경을 혁신할 수 있습니다.pywintypes.datetime
타임스탬프를 사용하여 타임스탬프에 대한 개체timestamp
방법.표준 시간대를 안전하게 사용하려면 다음을 사용합니다.tzinfo
속성. 참조In [4]:
전체 구문을 보려면 아래를 참조하십시오.
방금 pd를 만들려다가 같은 문제가 발생했습니다.Excel 책의 몇 줄에 있는 DataFrame.나는 이 끔찍한 파이썬이 작동을 멈췄다는 대화상자를 계속 받았습니다.
In [1]: pywindt
Out[1]: pywintypes.datetime(2018, 9, 13, 14, 2, 24, tzinfo=TimeZoneInfo('GMT Standard Time', True))
In [2]: str(pywindt)
Out[2]: '2018-09-13 14:02:24+00:00'
In [3]: # Conversion takes place here!
In [4]: dt = datetime.datetime.fromtimestamp(
...: timestamp=pywindt.timestamp(),
...: tz=pywindt.tzinfo
...: )
In [5]: dt
Out[5]: datetime.datetime(2018, 9, 13, 14, 2, 24, tzinfo=TimeZoneInfo('GMT Standard Time', True))
In [6]: str(dt)
Out[6]: '2018-09-13 14:02:24+00:00'
후속 조치로 셀 값이 pywintype datetime인지 여부를 확인해야 하는 경우 다음과 같이 하면 됩니다.
In [7]: import pywintypes
In [8]: isinstance(pywindt, pywintypes.TimeType)
Out[8]: True
In [9]: # just out of curiousity
In [10]: isinstance(dt, pywintypes.TimeType)
Out[10]: False
판다는 다음을 사용하여 비슷한 해결책을 가지고 있습니다.pd.Timestamp()
다음을 삽입합니다.pywintype.datetime
인수 및 집합으로 objectunit='s'
(Seconds(초)의 경우 또는 타임스탬프가 있는 단위를 입력합니다.)
판다 시리즈의 경우:
def convert(time):
return pd.Timestamp(time.timestamp(), unit = 's')
newSeries = oldSeries.apply(convert)
pywintype.datetime을 datetime.datetime으로 변환하기 위한 단순 옵션 추가
datetime.datetime 유형을 pywintype.datetime에 추가하면 datetime.datetime 유형에 캐스트가 발생합니다.이것은 예를 들어 0 델타를 사용하여 수행할 수 있습니다.
원래 질문의 경우 추가 모듈 없이 아래를 사용할 수 있습니다.
desired_datetime_type = excel_ws.Cells(2, 4).Value + datetime.timedelta(0)
이런 것도 해볼 수 있어요.
prior_datetime = datetime.strptime((str(excel_ws.Cells(2, 4).Value)).rstrip("+00:00"), '%Y-%m-%d %H:%M:%S')
나는 사용자 스트립에 대한 제안을 많이 봅니다.00에서 시간이 끝나면 작동하지 않는다는 것을 알게 되었습니다.
>>> oltime='2020-06-21 19:50:00+00:00'
>>> str(oltime).rstrip("+00:00").strip()
'2020-06-21 19:5'
대신 대체를 사용하는 것이 좋습니다.
>>> str(oltime).replace('+00:00', '')
'2020-06-21 19:50:00'
>>>
이는 rstrip이 문자열의 왼쪽 끝에서 시작하여 오른쪽으로 작동하는 각 문자의 모든 인스턴스를 제거하고 있기 때문입니다.
>>> str(oltime).rstrip('+0:')
'2020-06-21 19:5'
>>>
위의 Alex의 답변에서 python 3.8.3rc1과 datetime을 사용하여 %S와 %z 사이의 공간을 제거하면 다음과 같이 작동합니다.
>>> import datetime
>>> datetime.datetime.strptime("2016-04-01 17:29:25+00:00", '%Y-%m-%d %H:%M:%S%z')
datetime.datetime(2016, 4, 1, 17, 29, 25, tzinfo=datetime.timezone.utc)
만약 시간대의 .r 스트립이 너무 징그럽게 느껴진다면 아래 정규 표현식이 있는 해결책이 있습니다.
반환된 숫자 형식에 실제로 시간대가 포함되어 있는 경우 처리할 수 있어야 합니다!
from datetime import datetime
import re
def xldatetime_to_datetime(xl_datetime):
"""
takes the str() value of a pywintypes.datetime object and
converts it to a datetime.datetime object via regular expression
"""
p = re.compile('(?<=\d{4}(-\d{2}){2}\s\d{2}(:\d{2}){2})\+\d{2}:\d{2}')
#2021-07-12 08:26:04+00:00 -> 2021-07-12 08:26:04
xl_datetime = p.sub('',xl_datetime)
py_datetime = datetime.strptime(xl_datetime,'%Y-%m-%d %H:%M:%S')
return py_datetime
Alex Lord Thorsen의 대답은 매우 가까웠습니다.문자열의 모든 문자를 올바른 지시문과 일치시켜야 합니다.AlexLordThorsen 코드가 'Space' 문자열을 시간대 지시문 %z와 일치시키려 했지만 잘못된 코드입니다.아래는 더 나은 설명이 있는 이미지입니다.
아래 수정된 코드가 작동합니다.
>>> datetime.datetime.strptime("2016-04-01 17:29:25+00:00", '%Y-%m-%d %H:%M:%S%z')
datetime.datetime(2016, 4, 1, 17, 29, 25, tzinfo=datetime.timezone.utc)
언급URL : https://stackoverflow.com/questions/39028290/python-convert-pywintyptes-datetime-to-datetime-datetime
'programing' 카테고리의 다른 글
예외 ORA-08103: 최대 절전 모드의 setfetchsize를 사용하는 데 개체가 더 이상 없습니다. (0) | 2023.09.03 |
---|---|
웅변가\모델의 차이: get()와 all() (0) | 2023.09.03 |
오라클에서 프로시저 내부에 테이블을 만드는 방법은 무엇입니까? (0) | 2023.09.03 |
PowerShell: 특수 문자가 포함된 To-Json 변환 문제 (0) | 2023.09.03 |
setFetchSize()는 언제 무엇으로 지정해야 합니까? (0) | 2023.09.03 |