我有 numpy 数组中的数据,其中包括年、月和日作为列, 我想计算儒略日或“一年中的某一天”(DOY),它也应该是一个 numpy 数组。
DOY的计算公式为:
import datetime
y = 2017
m = 4
d = 13
DOY = int(dt.datetime(y, m, d).strftime('%j')
它将打印 103
假设我们有 y_ar
、m_ar
和 d_ar
作为年、月和日的数组,
我尝试过:
julians = int(dt.datetime(y_ar, m_ar, d_ar).strftime('%j'))
它给出了我的TypeError:只有长度为1的数组可以转换为Python标量
我尝试了其他成功的方法:
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/