programing

python datetime.datetime을 일련 번호를 Excel로 변환하는 방법

iphone6s 2023. 5. 27. 09:56
반응형

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

반응형