python datetime.datetime을 일련 번호를 Excel로 변환하는 방법
제가 쓰고 있는 데이터 멍글 스크립트를 위해 날짜를 엑셀 일련번호로 변환해야 합니다.OpenOffice Cal 워크북의 날짜를 사용하여 '1-Jan 1899 00:00:00'이 숫자 0에 매핑된다는 것을 추론할 수 있었습니다.
python datetime 객체에서 엑셀 일련번호로 변환하기 위해 다음 함수를 작성했습니다.
def excel_date(date1):
temp=dt.datetime.strptime('18990101', '%Y%m%d')
delta=date1-temp
total_seconds = delta.days * 86400 + delta.seconds
return total_seconds
하지만 일부 샘플 날짜를 시도해보니 엑셀(오픈오피스 계산)에서 날짜를 숫자로 포맷했을 때와 숫자가 다릅니다.예를 들어 '2009-03-20'을 테스트하면 Python에서 3478032000이 제공되며 excel은 일련 번호를 39892로 렌더링합니다.
위의 공식에 무슨 문제가 있습니까?
*참고: 저는 Python 2.6.3을 사용하고 있으므로 datetime에 액세스할 수 없습니다.total_seconds(총_초):
http://www.cpearson.com/excel/datetime.htm 에 따르면 Excel "익스톨 날짜" 형식은 실제로 1900-01-00 이후의 일 수이며, 하루의 일부에 해당하는 부분적인 구성 요소입니다. (월 0일과 같은 것이 없기 때문에 실제로는 1899-12-31로 간주해야 한다고 생각합니다.)
따라서 다음과 같이 해야 할 것으로 보입니다.
def excel_date(date1):
temp = dt.datetime(1899, 12, 30) # Note, not 31st Dec but 30th!
delta = date1 - temp
return float(delta.days) + (float(delta.seconds) / 86400)
이것은 엑셀 시리얼 날짜 형식과 정확히 관련이 없지만, 이것은 엑셀로 파이썬 날짜 시간을 내보내는 데 있어 최고의 히트작이었습니다.제가 특히 유용하고 간단한 것은 strftime을 사용하여 수출하는 것입니다.
import datetime
current_datetime = datetime.datetime.now()
current_datetime.strftime('%x %X')
Excel에서 유효한 날짜/시간으로 승인하고 Excel에서 정렬할 수 있는 '06/25/140 09:59:29' 형식으로 출력됩니다.
날짜에 대한 DATEVALUE() excel 일련 번호를 원하는 것이 문제라면 toordinal() 함수를 사용할 수 있습니다.파이썬 일련 번호는 1년차 1월 1일부터 시작하고 엑셀은 1900년 1월 1일부터 시작하므로 오프셋을 적용합니다.Excel 1900 윤년 버그도 참조하십시오(https://support.microsoft.com/en-us/help/214326/excel-incorrectly-assumes-that-the-year-1900-is-a-leap-year)
def convert_date_to_excel_ordinal(day, month, year) :
offset = 693594
current = date(year,month,day)
n = current.toordinal()
return (n - offset)
타사 모듈을 사용하면 다음과 같은 구조의 튜플을 제공할 수 있습니다.(year, month, day, hour, minute, second)필요한 경우 마이크로초 성분에서 일 분율을 계산합니다.
from datetime import datetime
from xlrd import xldate
from operator import attrgetter
def excel_date(input_date):
components = ('year', 'month', 'day', 'hour', 'minute', 'second')
frac = input_date.microsecond / (86400 * 10**6) # divide by microseconds in one day
return xldate.xldate_from_datetime_tuple(attrgetter(*components)(input_date), 0) + frac
res = excel_date(datetime(1900, 3, 1, 12, 0, 0, 5*10**5))
# 61.50000578703704
@akgood의 답변에 따르면, 날짜 시간이 1/0/1900 이전이고 반환 값이 잘못되었을 때, 수정된 반환 식을 다음과 같이 할 수 있습니다.
def excel_date(date1):
temp = dt.datetime(1899, 12, 30) # Note, not 31st Dec but 30th!
delta = date1 - temp
return float(delta.days) + (-1.0 if delta.days < 0 else 1.0)*(delta.seconds)) / 86400
이것은 CSV 패키지를 사용하여 스프레드시트를 생성하는 테스트를 수행했을 때 작동했습니다.
from datetime import datetime
def excel_date(date1):
return date1.strftime('%x %-I:%M:%S %p')
now = datetime.now()
current_datetime=now.strftime('%x %-I:%M:%S %p')
time_data.append(excel_date(datetime.now()))
...
언급URL : https://stackoverflow.com/questions/9574793/how-to-convert-a-python-datetime-datetime-to-excel-serial-date-number
'programing' 카테고리의 다른 글
| 사용자 지정 컨테이너 환경 변수와 함께 Azure Webapp 배포 (0) | 2023.05.27 |
|---|---|
| 전자 메일 주소가 시스템에 유효한지 확인합니다.넷.메일.메일주소 (0) | 2023.05.27 |
| Windows용으로 좋은 grep 도구는 무엇입니까? (0) | 2023.05.27 |
| "2>&1"은 무엇을 의미합니까? (0) | 2023.05.27 |
| WPF 백그라운드 작업자 사용 방법 (0) | 2023.05.27 |