【问题标题】:Use of datetime timedelta with numpy 3d array使用带有 numpy 3d 数组的 datetime timedelta
【发布时间】:2020-01-12 07:15:42
【问题描述】:

我有一个 3D 数组,其中包含基准日期(例如 01.01.2000)过去的天数。我对一年中的实际日期(DOY:1-365/366)感兴趣,而不是给定日期过去的总天数。

对于单个值,以下语法有效。例如,

import numpy as np
import datetime

data = 1595
date = datetime.datetime(2000,1,1,0,0) + datetime.timedelta(data -1)
date.timetuple().tm_yday
134

但是,我在使用 3D 数组时遇到了问题。

import numpy as np
import datetime

data = np.random.randint(5, size = (2,2,2))
data = data + 1595
data
array([[[1596, 1595],
    [1599, 1599]],

   [[1596, 1599],
    [1595, 1595]]])

#Function
def Int_to_DOY(int_array):
    date_ = datetime.datetime(2000,1,1,0,0) + datetime.timedelta(int_array - 1)
    return date_.timetuple().tm_yday

doy_data = data * 0 #Empty array

for i in range(2):
    doy_data[:, :, i] = Int_to_DOY(data[:, :, i])

这是错误消息,我无法弄清楚。

TypeError: unsupported type for timedelta days component: numpy.ndarray

感谢您的帮助。

【问题讨论】:

  • 你能添加你的预期输出吗?
  • array([[[135, 134], [138, 138]], [[135, 138], [134, 134]]])

标签: python-3.x pandas numpy datetime timedelta


【解决方案1】:
import numpy as np
import datetime

data = np.random.randint(5, size = (2,2,2))
data = data + 1595

#Function
def Int_to_DOY(int_array):
    date_ = datetime.datetime(2000,1,1,0,0) + datetime.timedelta(int(int_array) -1)
    return date_.timetuple().tm_yday

doy_data = data.flatten()

for i in range(len(doy_data)):
    doy_data[i] = Int_to_DOY(doy_data[i])

doy_data = doy_data.reshape((2,2,2))

【讨论】:

  • 感谢您的解决方案,我相信,我正在推动一个二维数组,其中它应该是一个向量。
【解决方案2】:

既然你标记了pandas

data = np.array([[[1596, 1595],
    [1599, 1599]],

   [[1596, 1599],
    [1595, 1595]]])

s = pd.to_datetime('2000-01-01') + pd.to_timedelta(data.ravel(), unit='D') 
s.dayofyear.values.reshape(data.shape) - 1

输出:

array([[[135, 134],
        [138, 138]],

       [[135, 138],
        [134, 134]]], dtype=int64)

【讨论】:

  • 谢谢!我喜欢 pandas 的方法和我今天学到的新东西。
  • 注意:在更大的数组中,pandas 更快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
相关资源
最近更新 更多