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

标签 python arrays numpy

我有 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:只有长度为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/

相关文章:

Python:Selenium xpath 查找具有不区分大小写字符的元素?

python - word2vec gensim 多种语言

python - 如何在寻宝游戏中将积分添加到总积分中?

python - Cython 初学者 - 加速 numpy 广播

python - 如何使用 Facebook 的 TargetingSearch API 进行复杂查询?

javascript - 如果嵌套对象具有特定值,则从数组中删除对象

java - 将原始数组转换为对象并返回

java - JNA:如何在结构中指定可变长度(0+)数组?

python - 在所有方向和所有元素上获得一阶微分的最佳方法

python - 使用 Python、Numpy 可以更快地完成此操作?