【问题标题】:Filter by datetime and update dataframe based on other dataframe datetime按日期时间过滤并根据其他数据框日期时间更新数据框
【发布时间】:2019-01-15 12:31:53
【问题描述】:

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

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

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



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

问题
我想遍历 df1 的行和 df2 的行,并检查它们是否在 df2 的“开始”和“停止”时间之内(或之间),如果此语句为真,则更新 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. 难道没有(我猜应该是)一种更好的方法来进行过滤,然后遍历两个数据帧中的所有行,这似乎非常耗时,因此对我来说效率低下。

提前感谢您的帮助。

【问题讨论】:

标签: python pandas datetime dataframe filter


【解决方案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() 来获取您需要更新的行

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多