如何在 A 列中填充缺失的条目,并将相应的条目添加到列-B 与前一个单元格的值

数据挖掘 大数据 擅长
2022-02-14 03:35:34

我面临一个excel文件的问题。我有一个 2 列的 excel 表

A列: 每秒时间增量

B 列: 机器传感器的特定值

我面临的问题是当机器停止(不运动)时,深度增量在特定时间停止并且不在excel表中输入,一旦机器开始移动它再次添加起点的条目. 让我以更好的方式解释如下。

04:23:12    2709.082597
04:23:13    2708.747333
04:23:14    2708.442548
04:23:15    2708.229198
**04:23:16  2708.229198
04:24:01    2708.137763**
04:24:02    2707.924413

机器在 04:23:16 停止,并在 04:24:01 以 44 秒的间隔恢复活动。因此,excel 表错过了这 44 秒的时间条目。文件中有1000多个这样的条目。我希望A列(时间)应该从单元格A增加到单元格Z,而不会丢失第二个的任何条目(即使机器停止),并且应该将B列的相应值添加到所有44个单元格中是对应于时间 04:23:16(机器停止时)的传感器值,即 2708.229198。

例如,机器在 04:23:16 停止,B 列的传感器值为 2708.229198,我希望该文件应在 04:23:16 到 04:24:01(44 秒)之间填充所有缺失的条目),并且对于所有这 44 秒,B 列的值应为 2708.229198(B 列的值对应于 04:23:16),这可以对整个工作表进行。正如我解释的那样,它是一个非常长的文件并且手动执行该选项不合适,这可能需要数小时甚至数天,我想要一些实用的解决方案来解决这个问题。

在这方面,我们将不胜感激任何帮助或指导。

贾瓦德

3个回答

尝试制作一张从源代码派生的工作表。首先,将所有可能的时间有序地放入新工作表中。其次,从源头进行价值查找。第三,将 vlookup 放在 iferror 中以查找缺失值,对于 iferror 的第二部分,使用先前的值。

有两个主要步骤可以到达您想要的位置。首先,我们需要获取您所期望的时间戳(以秒为单位,没有间隙)。

遗憾的是,我们需要将您的数据分配到这些时间戳上,并用之前记录的值填充任何缺失值。

此解决方案使用 python。如果您不熟悉 Python 和数据框,这可能是一个很好的练习,它显示了与电子表格相比编程的强大功能。

基本设置

import pandas as pd
import numpy as np

这只是创建您提供的示例数据框。时间将用于创建日期时间索引,并且值将是“数据” - 我们唯一的列。

times = ["04:23:12", "04:23:13", "04:23:14", "04:23:15", "04:23:16", "04:24:01", "04:24:02"]
values = [2709.082597, 2708.747333, 2708.442548, 2708.229198, 2708.229198, 2708.137763, 2707.924413]

我们创建一个适当的日期时间系列作为我们的索引

index = pd.to_datetime(times)

将其放入数据框中

df = pd.DataFrame(index=index, data=values, columns=['data'])
df.head()
                        data    
2018-09-27 04:23:12  2709.082597
2018-09-27 04:23:13  2708.747333
2018-09-27 04:23:14  2708.442548
2018-09-27 04:23:15  2708.229198
2018-09-27 04:23:16  2708.229198

第一部分

现在我将创建第二个数据帧,但是它将在索引中具有所需的时间戳,即它将在几秒钟内上升而没有任何间隙

我们可以使用上面记录的第一个和最后一个时间戳(或您需要的任何其他时间戳)

new_start = df.index[0]
new_end = df.index[-1]

我们可以将频率指定为秒,使用freq='s'如下所示的参数:

new_index = pd.date_range(new_start, new_end, freq='s')

现在我们创建具有所需索引的空日期框:

new_df = pd.DataFrame(index=new_index)

第二部分

现在我们结合两个数据框(一个与您的数据,一个与目标索引),最后我们填充缺失值。

我们根据它们的索引合并两个数据框。使用 method="outer" 意味着我们将所有值都保留在两个索引中,因此不会丢失任何时间戳。在你的情况下,我们基本上只是new_index再次结束,因为它已经很完美了。

combined_df = pd.merge(df, new_df, method="outer", left_index=True, right_index=True)

最后一步非常简单:用最后记录的值填充缺失值。这里的ffill意思是forward fill,这正是你想要的:

final_df = combined_df.fillna(method='ffill')

final_df
                        data    
2018-09-27 04:23:12  2709.082597
2018-09-27 04:23:13  2708.747333
2018-09-27 04:23:14  2708.442548
2018-09-27 04:23:15  2708.229198
2018-09-27 04:23:16  2708.229198
2018-09-27 04:23:17  2708.229198
2018-09-27 04:23:18  2708.229198
...
...
2018-09-27 04:23:58  2708.229198
2018-09-27 04:23:59  2708.229198
2018-09-27 04:24:00  2708.229198
2018-09-27 04:24:01  2708.137763
2018-09-27 04:24:02  2707.924413

该解决方案显然只适用于处理此类静态数据,但更好的解决方案可能是在记录过程中实现一个短循环,如果没有给出新的记录,则只需重复最后一次记录,确保每秒记录一个数据点。

如果你可以使用 Python 和 Pandas,这真的很容易,只需要 2 行代码。从 n1k31t4 的示例中复制了一些代码。resample() 用 NaN 填充缺失的日期时间条目, bfill() 用之前的 # 填充 NaN。

>>> df = pd.DataFrame(index=pd.to_datetime(["04:23:12", "04:23:13", "04:23:14", "04:23:15", "04:23:16", "04:24:01", "04:24:02"]), data=[2709.082597, 2708.747333, 2708.442548, 2708.229198, 2708.229198, 2708.137763, 2707.924413])
>>> df
                               0
2020-08-23 04:23:12  2709.082597
2020-08-23 04:23:13  2708.747333
2020-08-23 04:23:14  2708.442548
2020-08-23 04:23:15  2708.229198
2020-08-23 04:23:16  2708.229198
2020-08-23 04:24:01  2708.137763
2020-08-23 04:24:02  2707.924413


>>> df.resample('1S').bfill()
                               0

2020-08-23 04:23:12  2709.082597
2020-08-23 04:23:13  2708.747333
2020-08-23 04:23:14  2708.442548
2020-08-23 04:23:15  2708.229198
2020-08-23 04:23:16  2708.229198
2020-08-23 04:23:17  2708.137763
2020-08-23 04:23:18  2708.137763
2020-08-23 04:23:19  2708.137763
2020-08-23 04:23:20  2708.137763
2020-08-23 04:23:21  2708.137763
2020-08-23 04:23:22  2708.137763
2020-08-23 04:23:23  2708.137763
2020-08-23 04:23:24  2708.137763
2020-08-23 04:23:25  2708.137763
2020-08-23 04:23:26  2708.137763
2020-08-23 04:23:27  2708.137763
2020-08-23 04:23:28  2708.137763
2020-08-23 04:23:29  2708.137763
2020-08-23 04:23:30  2708.137763
2020-08-23 04:23:31  2708.137763
2020-08-23 04:23:32  2708.137763
2020-08-23 04:23:33  2708.137763
2020-08-23 04:23:34  2708.137763
2020-08-23 04:23:35  2708.137763
2020-08-23 04:23:36  2708.137763
2020-08-23 04:23:37  2708.137763
2020-08-23 04:23:38  2708.137763
2020-08-23 04:23:39  2708.137763
...