numpy datetime64 加减日期间隔

31 投票
2 回答
58137 浏览
提问于 2025-04-18 01:11

我正在处理一个很大的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')

撰写回答