pandas DateTimeIndex を Excel の日付 (1899 年 12 月 30 日からの日数) に変換したい..datetime64s を受け取り、Excel の日付を返す関数で numpy.vectorize を使用しようとしました。numpy vectorize の動作に驚きました。最初の呼び出しで、戻り値の型を確認するためのテスト呼び出しで、提供されているように vectorize が datetime64 に渡されます。後続の呼び出しでは、datetime64 の内部ストレージ タイプ (私の場合は long) を渡します。内部的に、_get_ufunc_and_otypes は以下を呼び出します。
inputs = [asarray(_a).flat[0] for _a in args]
outputs = func(*inputs)
_vectorize_call は次のことを行います。
inputs = [array(_a, copy=False, subok=True, dtype=object)
for _a in args]
outputs = ufunc(*inputs)
結局のところ、内部の numpy 配列演算を使用して (x - day0)/1day を簡単に実行できます。しかし、この動作は奇妙に思えます (関数がベクトル化されると型が変わる)
ここに私のサンプルコードがあります:
import numpy
DATETIME64_ONE_DAY = numpy.timedelta64(1,'D')
DATETIME64_DATE_ZERO = numpy.datetime64('1899-12-30T00:00:00.000000000')
def excelDateToDatetime64(x):
return DATETIME64_DATE_ZERO + numpy.timedelta64(int(x),'D')
def datetime64ToExcelDate(x):
print type(x)
return (x - DATETIME64_DATE_ZERO) / DATETIME64_ONE_DAY
excelDateToDatetime64_Array = numpy.vectorize(excelDateToDatetime64)
datetime64ToExcelDate_Array = numpy.vectorize(datetime64ToExcelDate)
excelDates = numpy.array([ 41407.0, 41408.0, 41409.0, 41410.0, 41411.0, 41414.0 ])
datetimes = excelDateToDatetime64_Array(excelDates)
excelDates2 = datetime64ToExcelDate(datetimes)
print excelDates2 # Works fine
# TypeError: ufunc subtract cannot use operands with types dtype('int64') and dtype('<M8[ns]')
# You can see from the print that the type coming in is inconsistent
excelDates2 = datetime64ToExcelDate_Array(datetimes)