23

我正在解析一个巨大的 ascii 文件,其中包含分配给条目的日期。因此,我发现自己使用与 numpy.datetime64 并行的 datetime 包来添加数组功能。我知道 pandas 包可能最推荐用于日期,但是尝试在没有 pandas 的情况下完成它。我一直在寻找一种巧妙的方法来添加/减去某个日期步长,例如从 datetime64 对象中添加/减去一年或 3 个月。

目前,我正在将 dt64 对象转换为 dt 对象并使用替换功能来更改年份,然后必须将其转换回 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)
4

2 回答 2

44

您可以使用 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')

于 2014-05-21T16:56:02.263 回答
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)

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

于 2017-06-03T11:18:44.850 回答