遍历Python中的start,finish和class值

时间:2018-11-20 08:56:01

标签: python loops datetime dataframe range

我有一个小脚本,可以在我的熊猫数据集中创建一个名为class的新列,并为给定的时间范围分配class值。它运作良好,但是突然间我要输入数千个时间范围,想知道是否有可能编写某种循环来从熊猫数据框中获取三列(开始,结束和分类)。

dataset1
dataset2

使事情变得复杂的是,时间范围在数据框1中(例如,纳秒,30秒,4分钟)和在数据框2中(包含加速度计数据)具有不规则的间隔,时间序列数据以0.010秒的增量递增。由于我是Python的新手,因此不胜感激。

conditions = [(X['DATETIME'] < '2017-11-17 07:31:07') & (X['DATETIME']>= '2017-11-17 00:00:00'),(X['DATETIME'] < '2017-11-17 07:32:35') & (X['DATETIME']>= '2017-11-17 07:31:07'),(X['DATETIME'] < '2017-11-17 09:01:05') & (X['DATETIME']>= '2017-11-17 08:58:39')]
classes = ['0','1','2']
X['CLASS'] = np.select(conditions, classes, default='5')

1 个答案:

答案 0 :(得分:0)

有很多可能的解决方案,您可以使用您所说的for循环,等等。但是,如果您不熟悉Python,我想这个答案将向您展示更多有关python及其强大软件包的功能。我将在此处使用numpy包。而且我想您的第一个表位于名为X的熊猫数据框中,而第二个表位于名为condidtions的熊猫数据框中。

import numpy as np
X['CLASS'] = conditions['CLASS'].iloc[np.digitize(X['Datetime'].view('i8'),
                                                  conditions['Start'].view('i8')) - 1]

别担心,我不会让你在那里。因此np.digitize将其作为第一个列表,并根据第二个参数所定义的bin边界将其分类。因此,在这里您将获得与给定行中的时间相对应的condition的索引。

有一些细节需要注意:

  • .view('i8')提供了datetime对象的视图,numpy包可以轻松使用它(如果您有兴趣,可以阅读更多详细信息)
  • -1需要重新对齐结果(第一个条件开始后的值将得到1的值,但我们希望它从0开始。
  • 最后,我们使用iloc系列的conditions['CLASS']函数将这些索引映射到类值。