首页 > 解决方案 > 使用 pandas 追加记录

问题描述

我在 24 小时内从我的太阳能逆变器上传了 5 分钟的数据,这相当于 288 条记录。有时数据集不包含 288 条记录,通常是 285 到 287 条记录。它似乎几乎每天都会错过一些东西。我有使用 5 分钟数据创建每日记录的代码,但如果不是所有 5 分钟数据都在那里,它们是不准确的。我每天都在手动检查并手动添加丢失的记录,如果不存在的话,只需复制以前的记录即可。我知道这不是完美的,但最好没有记录和报告不足。

数据集在每条记录的值之间使用逗号 (,),在记录之间使用分号 (;)。即3条记录

20211002,15:35,27294,3.446,1080,1080,0.136,15380,600,NaN,244.4,0.000,0.000,0.000,1080.000,0.000,100.000;20211002,15,3,50,27204,8,38. 0.232,15330,660,NaN,246.0,0.000,0.000,0.000,1830.000,0.000,100.000;20211002,15:25,27051,3.416,4820,4824,0.609,15275,2580,NaN,0.0.0.4 0.000,4820.000,0.000,100.000

然后我使用 split 函数将其转换为数组

with open(r'C:\Users\david\GrowattAPI\5minutecheck.csv') as f:
    array = [l.split(",") for l in f.readline().split(";") if l]

这使

[['20211002', '15:35', '27294', '3.446', '1080', '1080', '0.136', '15380', '600', 'NaN', '244.4', '0.000 ', '0.000', '0.000', '1080.000', '0.000', '100.000'], ['20211002', '15:30', '27204', '3.435', '1830', '1836', '0.232', '15330', '660', 'NaN', '246.0', '0.000', '0.000', '0.000', '1830.000', '0.000', '100.000'], ['20211002', '15:25'、'27051'、'3.416'、'4820'、'4824'、'0.609'、'15275'、'1580'、'NaN'、'249.2'、'0.000'、'0.000'、 '0.000', '4820.000', '0.000','100.000']]

然后我用

df = pd.DataFrame(array, columns=['DATE', 'TIME', 'ENERGY_OUT', 'AAA', 'POWER_OUT', 'BBB', 'CCC', 'ENERGY_IN', 'POWER_IN', 'TEMPERATURE', 'VOLTAGE', 'v7', 'v8', 'v9', 'v10', 'v11', 'v12'])

计算每日数据。

我要做的是通过比较时间戳相隔 5 分钟来检查是否有 288 条记录。我可以使用

数组[0][1] 数组[1][1] 。. . 数组[n][1]

但我无法检查然后使用 df 追加。我要做的就是如果 5 分钟的数据不存在,那么只需复制前一条记录并将其添加到数组中。

任何帮助表示赞赏。

大卫

标签: pythonpandasdataframe

解决方案


当您在 15:35 缺少一个读数时,我已经模拟了这种情况。

columns = ['DATE', 'TIME', 'ENERGY_OUT', 'AAA', 'POWER_OUT', 'BBB', 'CCC', 'ENERGY_IN',
           'POWER_IN', 'TEMPERATURE', 'VOLTAGE', 'v7', 'v8', 'v9', 'v10', 'v11', 'v12']

array = [
    ['20211002', '15:40', '27294', '3.446', '1080', '1080', '0.136', '15380', '600',
        'NaN', '244.4', '0.000', '0.000', '0.000', '1080.000', '0.000', '100.000'],
    ['20211002', '15:30', '27204', '3.435', '1830', '1836', '0.232', '15330', '660',
        'NaN', '246.0', '0.000', '0.000', '0.000', '1830.000', '0.000', '100.000'],
    ['20211002', '15:25', '27051', '3.416', '4820', '4824', '0.609', '15275', '1580',
        'NaN', '249.2', '0.000', '0.000', '0.000', '4820.000', '0.000', '100.000']
]

通过使用前向填充每 5 分钟重新采样一次(使用以前的值),您可以填补空白。

df = pd.DataFrame(array, columns=columns)
df['DATETIME'] = pd.to_datetime(df['DATE']+' '+df['TIME'])
df = df.sort_values('DATETIME').set_index('DATETIME')
df_ffill = df.resample('5Min').ffill()

结果是:

                         DATE   TIME ENERGY_OUT    AAA POWER_OUT   BBB  ...     v7     v8     v9       v10    v11      v12
DATETIME                                                                ...                                               
2021-10-02 15:25:00  20211002  15:25      27051  3.416      4820  4824  ...  0.000  0.000  0.000  4820.000  0.000  100.000
2021-10-02 15:30:00  20211002  15:30      27204  3.435      1830  1836  ...  0.000  0.000  0.000  1830.000  0.000  100.000
2021-10-02 15:35:00  20211002  15:30      27204  3.435      1830  1836  ...  0.000  0.000  0.000  1830.000  0.000  100.000
2021-10-02 15:40:00  20211002  15:40      27294  3.446      1080  1080  ...  0.000  0.000  0.000  1080.000  0.000  100.000

[4 rows x 17 columns]

DATE 和 TIME 列的值仍然来自原始数据,但 DATETIME 之一是通过重新采样步骤更新的。


推荐阅读