如何在 Numpy 中选择最新的分钟值?

Posted

技术标签:

【中文标题】如何在 Numpy 中选择最新的分钟值?【英文标题】:How can I select the latest minute values in Numpy? 【发布时间】:2018-04-06 15:40:00 【问题描述】:

我有一个如下所示的 numpy 数组:

>>> array_data
array([[datetime.datetime(2017, 10, 24, 1, 3, 45, 104000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 3, 47, 901000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 3, 56, 214000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 4, 8, 11000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 4, 13, 120000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 4, 15, 714000), 50, 4],
   [datetime.datetime(2017, 10, 24, 1, 4, 16, 214000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 4, 27, 323000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 5, 13, 261000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 5, 56, 276000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 6, 0, 886000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 6, 38, 104000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 6, 38, 995000), 50, -1],
   [datetime.datetime(2017, 10, 24, 1, 6, 42, 511000), 51, 5],
   [datetime.datetime(2017, 10, 24, 1, 7, 4, 714000), 50, 5],
   [datetime.datetime(2017, 10, 24, 1, 7, 12, 823000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 7, 17, 229000), 50, -1],
   [datetime.datetime(2017, 10, 24, 1, 7, 45, 948000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 7, 56, 245000), 50, 1],
   [datetime.datetime(2017, 10, 24, 1, 8, 10, 761000), 50, -1],
   [datetime.datetime(2017, 10, 24, 1, 8, 21, 464000), 50, -3],
   [datetime.datetime(2017, 10, 24, 1, 8, 21, 761000), 50, -1]], dtype=object)

如果它是实时更新的,我如何在更新时选择最新一分钟的数据?例如,如果当前时间是2017, 10, 24, 1, 7, 17, 229000,我希望它打印出(50*5)+(50*1)+(50*-1),如果是2017, 10, 24, 1, 7, 45, 948000,它将打印出(50 *5)+(50*1)+(50*-1)+(50*1)。

我认为我可以在最新更新的行更新时提取它的分钟值,并创建一个向后循环并将它们的分钟值相互比较,直到它们不一样。但是,我认为当一分钟内有很多行并且更新比循环过程快时会消耗资源。有没有更有效的方法来做到这一点?

【问题讨论】:

虽然这个问题对我来说并不完全清楚,但如果您正在寻找按时间顺序跟踪实时更新,queue 数据结构可能更合适,甚至是一个数组按插入排序。 @crazyGamer 感谢您的评论。简单来说,就是想知道最新一分钟数据的范围。至于上面的数组,它将是[-3:]。我也想绘制数据,所以我认为我需要坚持使用 numpy 数组。 好吧,那么我的问题是:你想在numpy数组中保留所有分钟的数据记录,还是只保留最新的n(比如最新的4个)? @crazyGamer 我想保留所有数据,同时想实时跟踪一分钟数据的最新范围并进行解释。例如,如果最近一分钟(可能短于一分钟)内的值之和大于 600,我希望它发出信号。 【参考方案1】:

我建议使用熊猫。

您使用 numpy 数组创建一个数据框

df = pd.DataFrame(array_data[:, 1:],
                  index=array_data[:, 0], columns=['a', 'b'])

或创建新的并添加行

df = pd.DataFrame(columns=['a', 'b'])
df.loc[datetime.datetime.now()] = [0, 1]

然后你可以创建一个没有秒的datetime,并用它来切片

>>> d
datetime.datetime(2017, 10, 24, 1, 8, 21, 761000)
>>> dm = datetime.datetime(d.year, d.month, d.day, d.hour, d.minute)
>>> dm
datetime.datetime(2017, 10, 24, 1, 8)
>>> df[dm:]
                          a   b
2017-10-24 01:08:10.761  50  -1
2017-10-24 01:08:21.464  50  -3
2017-10-24 01:08:21.761  50  -1

你正在使用索引,所以它是有效的。

【讨论】:

感谢您的回答,但我正在尝试使用 numpy 数组来存储实时数据。我认为在处理实时大数据时使用 pandas 不合适? @maynull 好吧,pandas is build 在 numpy 之上……

以上是关于如何在 Numpy 中选择最新的分钟值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在numpy的二维矩阵中随机采样

如何在numpy矩阵中找到最小值?

如何在 Pandas/Numpy 中使用 dateOffset 对日内时间序列数据进行重新采样?

使用 numpy.random.normal 时如何指定上限和下限

如何在numpy数组中选择

如何在 TensorFlow 中使用 tf.get_variable 和 numpy 值初始化变量?