我想将一个Pandas的DateTimeIndex转换为Excel日期(自1899年12月30日起经过的天数)。我尝试使用numpy.vectorize来调用一个以datetime64类型为参数并返回Excel日期的函数。但是,我对numpy.vectorize的行为感到惊讶——在第一次调用时,它会传递原始的datetime64类型以查看返回类型。在后续调用中,它会传递datetime64的内部存储类型——在我的情况下是一个长整型。在内部,_get_ufunc_and_otypes会调用:
事实证明,我可以使用内部的numpy数组计算来做到这一点((x-day0)/ 1day)。但是这种行为似乎很奇怪(在向量化函数时更改类型)。
以下是我的示例代码:
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)