numpy datetime64添加或减去日期间隔

时间:2014-04-03 15:30:54

标签: python date numpy datetime64

我正在解析一个巨大的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)

2 个答案:

答案 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)

基于矢量的熊猫用法,我认为它处理闰年。