programing

python: pywintyptes.datetime을 datetime.datetime으로 변환합니다.

magicmemo 2023. 9. 3. 12:32
반응형

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와 일치시키려 했지만 잘못된 코드입니다.아래는 더 나은 설명이 있는 이미지입니다.

enter image description here

아래 수정된 코드가 작동합니다.

>>> 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

반응형