2
我想將pandas DateTimeIndex轉換爲excel日期(自12/30/1899以來的天數)..我嘗試在需要datetime64s並返回excel日期的函數上使用numpy.vectorize。我對numpy向量化的表現感到驚訝 - 在第一次調用時,測試調用來查看返回類型,vectorize按照提供的方式在datetime64中傳遞。在後續的調用中,它會傳入datetime64的內部存儲類型 - 在我的情況下是很長的。在內部,_get_ufunc_and_otypes電話:在datetime64和vectorize之間,在numpy 1.7.1中是否存在不良交互?
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)/ 1天。但是,這種行爲似乎很奇怪(當功能被矢量類型改變)
這裏是我的示例代碼:
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)
這一工程 - 非常感謝。我寫它的方式的行爲對我來說仍然很奇怪(特別是第一次調用通過了datetime64,隨後的調用獲得了底層的np.int64) – DaveBlob