我理解为什么不能将年/月 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
如何让它发挥作用?
编辑:
重复问题的答案不合适。我希望尽我所能,忽略极端情况。我正在尝试获得不错的日期标记,所以不精确也没关系。
如果需要,可以将 datetime64[D] 向下转换为 datetime64[M]。
这根本行不通,至少不能单独使用 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')
我是一名优秀的程序员,十分优秀!