我有一个小脚本,可以在我的熊猫数据集中创建一个名为class的新列,并为给定的时间范围分配class值。它运作良好,但是突然间我要输入数千个时间范围,想知道是否有可能编写某种循环来从熊猫数据框中获取三列(开始,结束和分类)。
使事情变得复杂的是,时间范围在数据框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')
答案 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']
函数将这些索引映射到类值。