按日期时间过滤并根据其他数据框日期时间更新数据框

时间:2018-08-08 09:38:00

标签: python pandas datetime dataframe filter

我刚刚开始学习熊猫,所以我才刚刚起步。 :)

情况
我有两个数据框(df1和df2)。

df1包含一台机器的多个传感器数据。传感器每分钟发送一次数据。我以日期时间格式设置了df1的索引(这实际上是传感器发送数据的日期和时间)。 enter image description here



df2包含一个生产单位的数据,即单位ID号(在数据帧中被称为“ Sarzs”)和过程开始和结束的日期时间以及该特定生产单位的输出质量。该数据框不包含与该特定时间相关的生产单位的数据(在该数据框中,您可以看到“ Sarzs_no”列在此阶段设置为NaN)。生产单元的开始和停止日期和时间存储在“开始”和“停止”列中,并且采用日期时间格式。 enter image description here

问题
我想遍历df1的行和df2的行,并检查它们是否在df2的“开始”和“停止”时间之内(或之间),如果此语句为true,则udpdate df1 ['Sarzs_no ']的价值 df2 ['Output']值。

到目前为止的进展:
到目前为止,我已经编写了以下代码:

for i in range (0, len(df2.index)):
    for j in range(0, len(df1.index)):
        print (df1.index)

我基本上有两个问题:

  1. 如何实际编写过滤代码并进行更新?
  2. 不是(应该是,应该有)更好的方法来进行过滤,然后遍历两个数据帧中的所有行,这似乎非常耗时,因此对我而言效率很低。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用包含时间戳记作为日期时间对象的数据帧,您可以使用以下内容:

#Loop over the dataframe containing start and end timestamps
for index,row in df2.iterrows():
    #Create a boolean mask to filter data
    mask = (df1.index > row['Start']) & (df1.index < row['Stop']) 
    df1.loc[mask,'Sarzs_no'] = row['Output']

对于包含开始和结束时间戳记的数据框的每一行,这将使与掩码条件匹配的行具有该行的“输出”标签

loc函数返回符合条件的行的索引,而iterrows函数创建一个迭代器,该迭代器逐行遍历数据框

编辑

有了日期时间索引,就可以使用:

df1[row['Start']:row['Stop']]

代替.loc()获取需要更新的行