我想将 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)