numpy datetime64 добавить или указать интервал даты

Я разбираю огромный файл ascii с датами, назначенными для записей. Итак, я обнаружил, что я использую пакет datetime параллельно с numpy.datetime64 для добавления возможностей массива. Я знаю, что пакет pandas, вероятно, наиболее рекомендуется использовать на дату, однако попытайтесь снять это без панд. Я оглядывался вокруг, чтобы аккуратно добавить / вычесть определенный datestep как один год или 3 месяца из объекта datetime64.

В настоящее время я конвертирую объект dt64 в объект dt и использую функцию replace, чтобы изменить год, например, и мне нужно будет преобразовать его обратно в dt64, что для меня немного беспорядочно. Поэтому я был бы признателен, если бы у кого-то было лучшее решение, использующее только формат numpy.datetime64.

Пример: Преобразование «ГГГГ-12-31» в «(ГГГГ-1) -12-31"

a = np.datetime64(2014,12,31) # a is dt64 object b = a.astype(object) # b is dt object converted from a c = np.datetime64( b.replace(b.year-1)) # c is dt64 object shifted back 1 year (a -1year) 

Вы можете использовать объект numpy.timedelta64 для выполнения временных дельта-вычислений на объекте numpy.datetime64, см. Datetime и Timedelta Arithmetic .

Поскольку год может быть либо 365, либо 366 дней, невозможно вычесть год, но вместо этого вы можете вычесть 365 дней:

 import numpy as np np.datetime64('2014-12-31') - np.timedelta64(365,'D') 

результаты:

numpy.datetime64('2013-12-31')

Как насчет:

 import numpy as np import pandas as pd def numpy_date_add(vd_array,y_array): ar=((vd_array.astype('M8[Y]') + np.timedelta64(1, 'Y') * \ y_array).astype('M8[M]')+ \ (vd_array.astype('M8[M]')- \ vd_array.astype('M8[Y]'))).astype('M8[D]')+ \ (vd_array.astype('M8[D]')-\ vd_array.astype('M8[M]')) return ar # usage valDate=pd.datetime(2016,12,31) per=[[0,3,'0-3Yr'], [3,7,'3-7Yrs'], [7,10,'7-10Yrs'], [10,15,'10-15Yrs'], [15,20,'15-20Yrs'], [20,30,'20-30Yrs'], [30,40,'30-40Yrs'], [40,200,'> 40Yrs']] pert=pd.DataFrame(per,columns=['start_period','end_period','mat_band']) pert['valDate']=valDate pert['startdate'] = numpy_date_add(pert.valDate.values,pert.start_period.values) pert['enddate'] = numpy_date_add(pert.valDate.values,pert.end_period.values) print(pert) 

Является ли векторное использование панд, и я думаю, что он имеет дело с високосными годами.