2

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) 
4

1 に答える 1