numpy datetime64 加减日期间隔
我正在处理一个很大的ASCII文件,这个文件里的每一条记录都有日期。我发现自己在同时使用datetime库和numpy.datetime64来增加数组的功能。我知道pandas库通常是处理日期的最佳选择,但我想尝试不使用pandas来完成这个任务。我一直在寻找一种简单的方法来给datetime64对象加减日期,比如加一年或减三个月。
目前,我是把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)
2 个回答
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)
这是基于向量的 pandas 用法,我觉得它处理了闰年问题。
60
你可以使用numpy.timedelta64对象来对numpy.datetime64对象进行时间差的计算,具体可以参考日期时间和时间差的运算。
因为一年可能是365天或366天,所以不能直接减去一年,但你可以减去365天:
import numpy as np
np.datetime64('2014-12-31') - np.timedelta64(365,'D')
这样会得到:
numpy.datetime64('2013-12-31')