29

作成しているデータ変更スクリプトの日付をExcelのシリアル番号に変換する必要があります。OpenOffice Calcワークブックの日付で遊んでみると、「1899年1月1日00:00:00」が数字のゼロにマッピングされていると推測できました。

PythonのdatetimeオブジェクトからExcelのシリアル番号に変換する次の関数を作成しました。

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

ただし、いくつかのサンプル日付を試してみると、Excel(OpenOffice Calc)で日付を数値としてフォーマットしたときに得られる数値とは異なります。たとえば、「2009-03-20」をテストすると、Pythonで3478032000が得られますが、Excelではシリアル番号が39892としてレンダリングされます。

上記の式の何が問題になっていますか?

*注:私はPython 2.6.3を使用しているため、datetime.total_seconds()にアクセスできません。

4

6 に答える 6

49

Excelの「シリアル日付」形式は、実際には1900-01-00からの日数であり、http://www.cpearson.com/excel/datetimeに基づく小数部分は1日の何分の1かであるように見えます。 htm。(月の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)
于 2012-03-05T22:22:07.803 に答える
15

これはExcelのシリアル日付形式とは正確には関係ありませんが、Pythonの日付時刻をExcelにエクスポートするためのトップヒットでした。私が特に便利でシンプルだと思ったのは、strftimeを使用してエクスポートすることです。

import datetime
current_datetime = datetime.datetime.now()
current_datetime.strftime('%x %X')

これは、次の形式「06/25/14 09:59:29」で出力されます。これは、Excelによって有効な日付/時刻として受け入れられ、Excelでの並べ替えが可能です。

于 2014-06-25T14:03:41.477 に答える
9

DATEVALUE()が日付のシリアル番号よりも優れていることが問題である場合は、toordinal()関数を使用できます。Pythonのシリアル番号は1年目の1月1日から始まりますが、Excelは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)
于 2017-11-24T18:47:19.183 に答える
1

サードパーティxlrd.xldateモジュールを使用すると、次のように構造化されたタプルを提供でき(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
于 2019-01-28T19:42:08.873 に答える
0

@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
于 2020-01-15T12:04:21.943 に答える
0

これは、 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()))
...
于 2020-11-23T21:18:56.177 に答える