将 numpy 数字化与日期时间数据一起使用

Using numpy digitize with datetime data

我正在尝试将由长时间测量序列组成的数据集分箱到多个离散分箱中。进行测量的时间保存在日期时间对象 t_data.

的 numpy 数组中

我也将 bin 边缘生成为日期时间对象数组 t_edges

当我打印出两个数组时,它们的内容显示为一系列 datetime.datetime(...) 项。

然后我尝试使用以下方法将 t_data 中的每个测量值分配给相关的 bin:

t_bin = np.digitize(t_data, t_edges)

但是,这会导致以下错误:

  File "<__array_function__ internals>", line 5, in digitize
  File "python3.9/site-packages/numpy/lib/function_base.py", line 4922, in digitize
    mono = _monotonicity(bins)
TypeError: Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'

这似乎是数据类型的问题,但我进行了一些搜索,但不确定如何更正此问题。似乎一个被归类为'object','O',而另一个是浮动?阅读错误消息我注意到数据系列和 bins 都应该单调增加,但也许是 datetime 混淆了这一点? 我知道 this 问题似乎与 datetime64 有类似的问题,但没有收到答案。

如果有人能给我一些东西来尝试解决这个问题以使其正常工作(或者告诉我是否不可能将 np.digitize() 与日期时间系列一起使用),我将不胜感激。

最小工作示例:

from datetime import datetime, timedelta
import numpy as np

sdate = datetime.strptime('2017-01-01 18:00:00', "%Y-%m-%d %H:%M:%S")
edate = datetime.strptime('2017-01-01 18:00:30', "%Y-%m-%d %H:%M:%S")

t_data = np.array([sdate + timedelta(minutes=x) for x in range((edate - sdate).seconds)])

t_edges = np.array([datetime.strptime('2017-01-01 18:00:00', "%Y-%m-%d %H:%M:%S"),
                   datetime.strptime('2017-01-01 18:00:10',"%Y-%m-%d %H:%M:%S"),
                   datetime.strptime('2017-01-01 18:00:20', "%Y-%m-%d %H:%M:%S")])

t_bin = np.digitize(t_data, t_edges)

我希望结果的形式为 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, ....., 3, 3, 3, 3, 3]

似乎 Numpy 将您的日期时间对象视为单纯的对象。

我建议在应用 np.digitize 之前将日期时间对象转换为时间戳。

示例:

from datetime import datetime, timedelta
import numpy as np

sdate = datetime.strptime('2017-01-01 18:00:00', "%Y-%m-%d %H:%M:%S")
edate = datetime.strptime('2017-01-01 18:00:30', "%Y-%m-%d %H:%M:%S")

t_data = np.array([(sdate + timedelta(seconds=x)) for x in range((edate - sdate).seconds)])

t_edges = np.array([datetime.strptime('2017-01-01 18:00:00', "%Y-%m-%d %H:%M:%S"),
                   datetime.strptime('2017-01-01 18:00:10',"%Y-%m-%d %H:%M:%S"),
                   datetime.strptime('2017-01-01 18:00:20', "%Y-%m-%d %H:%M:%S")])

t_data_ts = [datetime.timestamp(t) for t in t_data]
t_edges_ts = [datetime.timestamp(t) for t in t_edges]

t_bin = np.digitize(t_data_ts, t_edges_ts)

我修复了您的代码中的一些错误。