gpt4 book ai didi

python - 从 Python 中的 numpy 数组输入获取 'Day of Year' 数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:36 25 4
gpt4 key购买 nike

我在 numpy 数组中有数据,其中包括年、月和日作为列,我想计算儒略日或“一年中的某一天”(DOY),它们也应该是一个 numpy 数组。

DOY的计算公式为:

import datetime
y = 2017
m = 4
d = 13
DOY = int(dt.datetime(y, m, d).strftime('%j')

它将打印 103

假设我们有 y_arm_ard_ar 作为年月日数组,

我试过这个:

julians = int(dt.datetime(y_ar, m_ar, d_ar).strftime('%j'))

它给出了我的 TypeError: only length-1 arrays can be converted to Python scalars 我尝试了其他方法成功了:

julians = np.array(map(lambda (y, m, d): int(dt.datetime(y, m, d).strftime('%j')), zip(y_ar, m_ar, d_ar)))

虽然它给了我想要的东西,但我觉得逐个元素地取一个元素,然后输出一个列表,然后再将它转换回非 numpy 数组有点耗时!

谁能帮我确定错误发生的原因,是否有更好、更快的方法?

有助于测试解决方案的示例数组:

y_ar = np.array([1990, 2000, 2015, 2017])
m_ar = np.array([5, 8, 1, 12])
d_ar = np.array([13, 7, 30, 29])

最佳答案

datetime 与 numpy 数组结合使用通常会很慢,因为它会创建带有 dtype=object 的数组。但是,从 1.7.0 版开始,numpy 有一个内置的 datetime64 type。 .

使用起来有点奇怪,但这似乎有效:

原始解决方案(列表理解而不是 map )

import datetime as dt

y_ar = np.array([1990, 2000, 2015, 2017])
m_ar = np.array([5, 8, 1, 12])
d_ar = np.array([13, 7, 30, 29])

julians_ref = np.array([int(dt.datetime(y, m, d).strftime('%j')) for y, m, d in zip(y_ar, m_ar, d_ar)])

原生 numpy 解决方案

y_ar = (y_ar - 1970).astype('M8[Y]')
m_ar = (m_ar - 1).astype('m8[M]')
d_ar = (d_ar - 1).astype('m8[D]')

date_ar = y_ar + m_ar + d_ar # full date
julians = date_ar - y_ar + 1 # days since first day of the year

print(julians_ref) # [133 220 30 363]
print(julians) # [133 220 30 363]

julians = int(dt.datetime(y_ar, m_ar, d_ar).strftime('%j'))

it gives my TypeError: only length-1 arrays can be converted to Python scalars I tried

这是因为 datetime.datetime 不知道 numpy 数组。期望年、月和日的标量(=单个)值。当解释器试图将一个数组转换为一个标量时,这会失败,除非该数组等同于一个标量(它只有一个元素)。

关于python - 从 Python 中的 numpy 数组输入获取 'Day of Year' 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43391758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com