【问题标题】:numpy datetime64 add or substract date intervalnumpy datetime64 加减日期间隔
【发布时间】:2014-05-15 13:23:29
【问题描述】:

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

【问题讨论】:

    标签: python date numpy datetime64


    【解决方案1】:

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

    【讨论】:

    • 当然可以从日期中减去一年:结果是一个日期相同但日期相同但一年前的日期(闰年的月末明显更正)。即 2016-02-29 - 1 Y = 2015-02-28。
    【解决方案2】:

    怎么样:

    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 用法,我认为它处理闰年。

    【讨论】:

    • 可以重新组织一下吗?起初我很难理解发生了什么。例如:year = (arr.astype('M8[Y]') + np.timedelta64(1, 'Y') * years).astype('M8[M]'); month_delta = arr.astype('M8[M]') - arr.astype('M8[Y]'); time_delta = arr - arr.astype('M8[M]'); return year + month_delta + time_delta(显然在实际函数中将;替换为返回行)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2013-06-10
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多