【问题标题】:How can I make a python numpy arange of datetime如何使 python numpy 日期时间范围
【发布时间】:2012-08-21 15:55:21
【问题描述】:

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

这有点没用,所以我需要把它转换成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。

【问题讨论】:

标签: python datetime numpy timedelta


【解决方案1】:
from datetime import datetime, timedelta

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

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

【讨论】:

  • TypeError:“模块”对象不可调用。任何想法?首先要导入什么?
  • @weefwefwqg3 你的导入可能是import datetime 而不是from datetime import datetime,所以datetime 不是类而是模块本身。
【解决方案2】:

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)

【讨论】:

  • 如果我有 numpy 1.7,这就是答案。但是好像我有1.6.1,所以这个例子不起作用。
  • 并且还兼容我需要输出的日期时间。谢谢!
  • 这不是矢量化解决方案,所以可能会很慢
【解决方案3】:

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

【讨论】:

  • 我可以把步骤放在这里吗?例如:一周、10 天、一个月还是一年?
  • @weefwefwqg3:当然。使用np.timedelta64(...)
【解决方案4】:

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

【讨论】:

  • 谢谢 - 看起来我应该在整个任务中使用 pandas。下次:-)
【解决方案5】:

正如另一个答案中所述,对于 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 并将 timearray2 的 dtype 转换为 datetime64[s]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2011-07-28
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多