39

我有一些输入数据,输入文件中的时间戳从文件名中指定的日期时间开始以小时为单位。

这有点没用,所以我需要将其转换为 python datetime.datetime 对象,然后将其放入一个 numpy 数组中。我可以写一个 for 循环,但我想做类似的事情:

numpy.arange(datetime.datetime(2000, 1,1), datetime.datetime(2000, 1,2), datetime.timedelta(hours=1))

引发类型错误。

这可以做到吗?我坚持使用 python 2.6 和 numpy 1.6.1。

4

5 回答 5

42
from datetime import datetime, timedelta

t = np.arange(datetime(1985,7,1), datetime(2015,7,1), timedelta(days=1)).astype(datetime)

这里的重点是使用astype(datetime),否则结果将是datetime64

于 2015-12-17T01:58:54.537 回答
24

请参阅NumPy 日期时间和时间增量。基本上,您可以使用类型在 NumPy 中表示日期时间numpy.datetime64,这允许您执行值范围。

对于 NumPy 1.6,它的类型用处不大datetime64,您可以使用合适的列表推导来构建日期时间(另请参阅在 Python 中创建日期范围):

base = datetime.datetime(2000, 1, 1)
arr = numpy.array([base + datetime.timedelta(hours=i) for i in xrange(24)])

这产生

array([2000-01-01 00:00:00, 2000-01-01 01:00:00, 2000-01-01 02:00:00,
   2000-01-01 03:00:00, 2000-01-01 04:00:00, 2000-01-01 05:00:00,
   2000-01-01 06:00:00, 2000-01-01 07:00:00, 2000-01-01 08:00:00,
   2000-01-01 09:00:00, 2000-01-01 10:00:00, 2000-01-01 11:00:00,
   2000-01-01 12:00:00, 2000-01-01 13:00:00, 2000-01-01 14:00:00,
   2000-01-01 15:00:00, 2000-01-01 16:00:00, 2000-01-01 17:00:00,
   2000-01-01 18:00:00, 2000-01-01 19:00:00, 2000-01-01 20:00:00,
   2000-01-01 21:00:00, 2000-01-01 22:00:00, 2000-01-01 23:00:00], dtype=object)
于 2012-08-27T06:44:41.367 回答
20

使用现代 NumPy,您可以这样做:

np.arange(np.datetime64('2017-01-01'), np.datetime64('2017-01-08'))

它给你:

array(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
       '2017-01-05', '2017-01-06', '2017-01-07'], dtype='datetime64[D]')
于 2017-03-01T07:41:58.413 回答
10

如另一个答案中所述,对于 Numpy > 1.7,您可以使用 Numpy 的内置日期时间功能。Numpy 文档中的示例不包括使用np.arangewith 步骤,所以这里有一个:

timearray = np.arange('2000-01-01', '2000-01-02',np.timedelta64(1,'h'), dtype='datetime64')

Numpy 将此结果的 dtype 设置为datetime64[h]. 您可以使用 将其显式设置为更小的时间单位dtype='datetime64[m]'

在版本 1.8.1(我预计更早)中,尝试向该结果数组添加小于一小时的偏移量将无效。

  • timearray += np.timedelta64(10,'s')不变timearray
  • timearray2 = timearray + np.timedelta64(10,'s')将增加 10 秒timearray并将 dtype 转换timearray2datetime64[s]
于 2016-06-27T16:05:44.710 回答
9

请注意,@nneonneo 解决方案可以简化为

result = first_date + np.arange(24) * datetime.timedelta(hours=1)

感谢 NumPy 数组操作。然后result数组有一个dtype=object.

对于更复杂的范围,您可能对scikits.timeseries包(不再维护)或更好的包感兴趣,该 pandas包重新实现了scikits.timeseries. 这两个软件包都支持旧版本的 NumPy(1.5、1.6...)

于 2012-08-27T08:39:09.157 回答