python - 使用 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 分钟的数据不存在,那么只需复制前一条记录并将其添加到数组中。
任何帮助表示赞赏。
大卫
解决方案
当您在 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 之一是通过重新采样步骤更新的。
推荐阅读
- tensorflow - 如何向 TensorFlow 的 Adam 优化器添加正则化(L1/L2)?
- python - 收到以下错误..TypeError:在 python 中使用 2D numpy 数组时不理解数据类型
- java - Jenkins 作业失败,出现错误 java.lang.NoClassDefFoundError
- c# - Cassandra C# 结果不断增加
- php - Drupal 网站抓取
- json - 触发器从 PostgreSQL 中的 JSON 对象创建记录
- node.js - Mongoose find 不返回结果 mongo 确实
- java - 在 Spring 上下文中模拟 bean
- angular - 如何管理具有相同路线的多个项目?
- pandas - Pandas - 将日期列从 dd/mm/yy hh:mm:ss 转换为 yyyy-mm-dd hh:mm:ss