파이썬에서 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
'source' 카테고리의 다른 글
IF 문 내의 "및" 및 "또는" 문제 (0) | 2023.06.19 |
---|---|
다중값 매개변수의 기본값으로 모두 선택 (0) | 2023.06.19 |
Git 저장소에 있는 달링 커밋과 방울은 무엇이며 그것들은 어디에서 왔습니까? (0) | 2023.06.19 |
키 저장소를 만들려면 어떻게 해야 합니까? (0) | 2023.06.19 |
2단계 인증을 사용하는 GitHub의 GitClone over https (0) | 2023.06.19 |