如何模糊地将一年添加到numpy中的日期?

时间:2016-10-27 17:20:25

标签: python numpy

我理解为什么你不能在一天中添加一年/月timedelta64,因为一个月或几年可能有不同的天数。但我希望在工作日期上加上一年的时间,因为所有必要的信息都是可用的。唉,我很难过:

import numpy as np

print(np.datetime64("2015-06-01") + np.timedelta64(1, "Y"))

# TypeError: Cannot get a common metadata divisor for NumPy datetime metadata [D] and [Y] because they have incompatible nonlinear base time units

如何让它发挥作用?

编辑:

重复问题的答案不合适。我希望尽可能地做到这一点,忽略角落的情况。我试图获得不错的约会,所以不精确就好了。

如果我需要的话,像downcast datetime64 [D]到datetime64 [M]之类的东西。

2 个答案:

答案 0 :(得分:2)

这根本不起作用,至少不是单独使用numpy。

天,小时,分钟,秒都可以转换,因为它们具有兼容的基本单位。一分钟总是60秒,一小时总是60分钟,一天24小时。

特别对待年份和月份,因为它们代表的时间会根据使用时间而变化。虽然timedelta日单位相当于24小时,但无法将月份单位转换为天数,因为不同的月份具有不同的天数。通过扩展,无法将年数转换为数天。

为了恰当地实现这一点,您需要决定如何解决闰年等冲突。这不是单独使用numpy可以完成的事情。算术与numpy.datetime64个对象的工作方式与其他库不同,as mentioned in the documents无法在几天和几个月之间进行转换。

普通的datetimerelativedelta会起作用,因为这些图书馆已经对这些冲突的行为进行了编纂。

from dateutil.relativedelta import relativedelta
from datetime import datetime
datetime(2016, 2, 29) + relativedelta(years=1)
#datetime.datetime(2017, 2, 28, 0, 0)

所以,如果你喜欢这些日期时间库如何排序......这样的东西可以得到结果......

from datetime import datetime
from dateutil.relativedelta import relativedelta
import numpy as np
def fuzzy_add(npdt, years):
    year, month, day = str(npdt).split("-")
    d = datetime(int(year), int(month), int(day))
    delta = relativedelta(years=years)
    the_date = d + delta
    new_npdt = np.datetime64(the_date.isoformat()[:10])
    return new_npdt

示例:

fuzzy_add(np.datetime64("2016-02-29"), 1)
#numpy.datetime64('2017-02-28')

答案 1 :(得分:0)

也许最简单的解决方案是使用字符串操作。

import numpy as np

def add_years(date, n_years):
    y, m, d = str(date).split("-")
    return np.datetime64("{}-{}-{}".format(int(y)+n_years, m, d))

my_date = np.datetime64("2015-06-01")
new_date = add_years(my_date, n_years=1)
print new_date