如何使一个python numpy arange of datetime

Mel*_*nie 26 python datetime numpy timedelta

我有一些输入数据,输入文件中的时间戳是从文件名中指定的日期时间开始的小时数.

这有点无用,所以我需要将它转换为python datetime.datetime对象,然后将它放在一个numpy数组中.我可以写一个for循环,但我想做的事情如下:

numpy.arange(datetime.datetime(2000, 1,1), datetime.datetime(2000, 1,2), datetime.timedelta(hours=1))
Run Code Online (Sandbox Code Playgroud)

这会引发TypeError.

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

小智 23

from datetime import datetime, timedelta

t = np.arange(datetime(1985,7,1), datetime(2015,7,1), timedelta(days=1)).astype(datetime)
Run Code Online (Sandbox Code Playgroud)

这里的关键是使用astype(datetime),否则结果将是datetime64.

  • @weefwefwqg3您的导入可能是“import datetime”而不是“from datetime import datetime”,因此“datetime”不是类而是模块本身。 (2认同)

nne*_*neo 14

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

对于NumPy 1.6,其datetime64类型不太有用,您可以使用合适的列表推导来构建日期时间(另请参阅在Python中创建一系列日期):

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

这产生了

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)
Run Code Online (Sandbox Code Playgroud)


Joh*_*nck 12

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

np.arange(np.datetime64('2017-01-01'), np.datetime64('2017-01-08'))
Run Code Online (Sandbox Code Playgroud)

它给你:

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]')
Run Code Online (Sandbox Code Playgroud)

  • @ weefwefwqg3:好的.使用`np.timedelta64(...)`. (2认同)

Pie*_* GM 8

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

result = first_date + np.arange(24) * datetime.timedelta(hours=1)
Run Code Online (Sandbox Code Playgroud)

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

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


Tha*_*hav 7

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

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]