我正在解析一个巨大的ascii文件,其中包含分配给条目的日期。所以,我发现自己使用与numpy.datetime64并行的datetime包来添加数组功能。我知道pandas包可能最适合用于约会,但是尝试在没有熊猫的情况下将其拉出来。我一直在寻找一种巧妙的方法来添加/减去某个日期步骤,例如从datetime64对象中提取一年或3个月。
目前,我正在将dt64对象转换为dt对象,并使用replace函数来更改年份,并且必须将其转换回dt64,这对我来说有点乱。所以,如果有人只使用numpy.datetime64格式有更好的解决方案,我将不胜感激。
示例:转换" YYYY-12-31"到"(YYYY-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)
答案 0 :(得分:12)
您可以使用numpy.timedelta64对象在numpy.datetime64对象上执行时间增量计算,请参阅Datetime and Timedelta Arithmetic。
由于一年可能是365天或366天,因此无法减去一年,但您可以减去365天:
import numpy as np
np.datetime64('2014-12-31') - np.timedelta64(365,'D')
结果:
numpy.datetime64('2013-12-31')
答案 1 :(得分:1)
怎么样:
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)
基于矢量的熊猫用法,我认为它处理闰年。