source

파이썬에서 1900년 이전 날짜에 대해 strftime 유사 함수를 사용할 수 있는 방법이 있습니까?

manysource 2023. 6. 19. 21:42

파이썬에서 1900년 이전 날짜에 대해 strftime 유사 함수를 사용할 수 있는 방법이 있습니까?

나는 이것을 깨닫지 못했지만, 분명히 파이썬의strftime함수는 1900년 이전 날짜를 지원하지 않습니다.

>>> from datetime import datetime
>>> d = datetime(1899, 1, 1)
>>> d.strftime('%Y-%m-%d')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: year=1899 is before 1900; the datetime strftime() methods require year >= 1900

내가 이걸 하기 위해 무언가를 해킹할 수 있다고 확신하지만, 나는 생각합니다.strftime함수에는 이유가 있습니다(또한 사전 예약 날짜를 지원할 수 없는 이유도 있습니다).1900년 이전 날짜를 지원할 수 있어야 합니다.저는 그냥.str하지만 너무 많은 차이가 있습니다.즉, 마이크로초 또는 시간대가 있을 수도 있고 없을 수도 있습니다.이것에 대한 해결책이 있습니까?

데이터를 텍스트 파일에 쓰고 Oracle SQL*Loader를 사용하여 데이터베이스에 로드할 수 있도록 이러한 작업을 수행하고 있습니다.

저는 결국 알렉스 마르텔리의 대답을 하게 되었습니다.보다 완벽한 구현 방법은 다음과 같습니다.

>>> from datetime import datetime
>>> d = datetime.now()
>>> d = d.replace(microsecond=0, tzinfo=None)
>>> str(d)
'2009-10-29 11:27:27'

유일한 차이점은str(d)와 동등합니다.d.isoformat(' ').

등포맷 작업datetime범위 제한이 없는 인스턴스:

>>> import datetime
>>> x=datetime.datetime(1865, 7, 2, 9, 30, 21)
>>> x.isoformat()
'1865-07-02T09:30:21'

다른 형식의 문자열이 필요한 경우 해당 문자열의 조각을 잘라내고, 주사위 모양으로 만들고, 리믹스하는 것은 어렵지 않습니다.isoformat이것은 매우 일관적입니다 (YYYY-MM-DDTHH:MM:SS.mmmmmm마이크로초가 0인 경우 점과 후속 마이크로초가 생략됨).

이에 대한 설명서는 매우 명확한 것 같습니다.

정확한 범위는 다음과 같습니다.strftime()또한 플랫폼에 따라 작업이 다릅니다.플랫폼에 관계없이 1900년 이전의 연도는 사용할 수 없습니다.

따라서 사용할 수 있는 솔루션은 없습니다.strftime()다행히도, 이것을 "손으로" 하는 것은 매우 간단합니다.

>>> "%02d-%02d-%02d %02d:%02d" % (d.year,d.month,d.day,d.hour,d.minute)
'1899-01-01 00:00'

mxDateTime 임의 날짜를 처리할 수 있습니다.파이썬의time그리고.datetime모듈은 내부적으로 UNIX 타임스탬프를 사용하므로 범위가 제한됩니다.

In [5]: mx.DateTime.DateTime(1899)
Out[5]: <mx.DateTime.DateTime object for '1899-01-01 00:00:00.00' at 154a960>

In [6]: DateTime.DateTime(1899).Format('%Y-%m-%d')
Out[6]: 1899-01-01

이것은 matplotlib 소스에서 온 것입니다.자신의 것을 굴리기 위한 좋은 출발점을 제공할 수 있습니다.

def strftime(self, dt, fmt):
    fmt = self.illegal_s.sub(r"\1", fmt)
    fmt = fmt.replace("%s", "s")
    if dt.year > 1900:
        return cbook.unicode_safe(dt.strftime(fmt))

    year = dt.year
    # For every non-leap year century, advance by
    # 6 years to get into the 28-year repeat cycle
    delta = 2000 - year
    off = 6*(delta // 100 + delta // 400)
    year = year + off

    # Move to around the year 2000
    year = year + ((2000 - year)//28)*28
    timetuple = dt.timetuple()
    s1 = time.strftime(fmt, (year,) + timetuple[1:])
    sites1 = self._findall(s1, str(year))

    s2 = time.strftime(fmt, (year+28,) + timetuple[1:])
    sites2 = self._findall(s2, str(year+28))

    sites = []
    for site in sites1:
        if site in sites2:
        sites.append(site)

    s = s1
    syear = "%4d" % (dt.year,)
    for site in sites:
        s = s[:site] + syear + s[site+4:]

    return cbook.unicode_safe(s)

이것은 ctime 라이브러리(UTF)의 "기능"입니다.또한 당신은 2038년 이후에 문제가 있을 수 있습니다.

언급URL : https://stackoverflow.com/questions/1643967/is-there-any-way-to-use-a-strftime-like-function-for-dates-before-1900-in-python