我理解为什么你不能在一天中添加一年/月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]之类的东西。
答案 0 :(得分:2)
这根本不起作用,至少不是单独使用numpy。
天,小时,分钟,秒都可以转换,因为它们具有兼容的基本单位。一分钟总是60秒,一小时总是60分钟,一天24小时。
特别对待年份和月份,因为它们代表的时间会根据使用时间而变化。虽然timedelta日单位相当于24小时,但无法将月份单位转换为天数,因为不同的月份具有不同的天数。通过扩展,无法将年数转换为数天。
为了恰当地实现这一点,您需要决定如何解决闰年等冲突。这不是单独使用numpy可以完成的事情。算术与numpy.datetime64
个对象的工作方式与其他库不同,as mentioned in the documents无法在几天和几个月之间进行转换。
普通的datetime
和relativedelta
会起作用,因为这些图书馆已经对这些冲突的行为进行了编纂。
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