python - 如何在 numpy 的日期中模糊添加年份?

标签 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

如何让它发挥作用?

编辑:

重复问题的答案不合适。我希望尽我所能,忽略极端情况。我正在尝试获得不错的日期标记,所以不精确也没关系。

如果需要,可以将 datetime64[D] 向下转换为 datetime64[M]。

最佳答案

这根本行不通,至少不能单独使用 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')

关于python - 如何在 numpy 的日期中模糊添加年份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40290688/

相关文章:

python - Pandas :基于另一列的过滤器进行聚合

python - numpy 逻辑中首次出现

python - 矩阵向量差的有效元素级argmin

python - 如何在同一项目中同时使用 3.2 和 2.7 Python 解释器运行代码?

python - Beautifulsoup soup.body 返回 None

python - Python3 中减少错误的 lambda

python - 当 fork 发生时,主进程中的 Numpy 线程池大小会发生变化

python - 将 % 格式更改为 f 字符串

python - 如何计算ndarray中元素的频率

python - 如何根据numpy中的条件拆分数组?