如何使一个python numpy arange of datetime

时间:2012-08-27 06:40:18

标签: 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))

抛出TypeError。

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

5 个答案:

答案 0 :(得分:22)

from datetime import datetime, timedelta

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

此处的关键点是使用astype(datetime),否则结果将为datetime64

答案 1 :(得分:13)

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

对于NumPy 1.6,其类型的datetime64类型少得多,您可以使用合适的列表推导来构建日期时间(另请参阅Creating a range of dates in 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)

答案 2 :(得分:10)

使用现代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]')

答案 3 :(得分:7)

请注意,@ 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 ......)

答案 4 :(得分:6)

如另一个答案中所述,对于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')将向timearray添加10秒,并将timearray2的dtype转换为datetime64[s]