python-3.x - Pandas:导入多个 CSV 文件并追加在一起,使元素按照时间索引排列
问题描述
我有数百个来自不同传感器数据点的 CSV 文件。他们每小时测量一次能量流。它们全年错开安装,因此每个数据文件的开始日期和时间都不同。
最终结果将是一个按日期和时间 (MM-DD-YYYY HH:MM:SS) 为全年编制索引的 Excel 文件。每个新的水平列将包含一个传感器的数据集。我需要每个传感器的数据与最终的 Excel 文件时间索引对齐。我想用零填充缺失的元素,在安装传感器之前数据不存在。
传感器 1 CSV 数据文件示例:
METER_ID, INTERVAL_DATE, INTERVAL_TIME, ENERGY
CC12345, 2/13/2019, 9:00:00, 1.332
CC12345, 2/13/2019, 10:00:00, 0.728
CC12345, 2/13/2019, 11:00:00, 1.583
CC12345, 2/13/2019, 12:00:00, 1.136
CC12345, 2/13/2019, 13:00:00, 0.888
CC12345, 2/13/2019, 14:00:00, 1.240
...
传感器 2 CSV 数据文件示例:
METER_ID, INTERVAL_DATE, INTERVAL_TIME, ENERGY
AA98765, 2/13/2019, 12:00:00, 0.498
AA98765, 2/13/2019, 13:00:00, 0.517
AA98765, 2/13/2019, 14:00:00, 1.223
...
...后来有数百个传感器文件...
最终结果将在 Excel 文件中,如下所示:
DATETIME, CC12345, AA98765, ...
1/1/2019 00:00:00, 0.000, 0.000
1/1/2019 01:00:00, 0.000, 0.000
1/1/2019 02:00:00, 0.000, 0.000
...
2/13/2019 09:00:00, 1.332, 0.000
2/13/2019 10:00:00, 0.728, 0.000
2/13/2019 11:00:00, 1.583, 0.000
2/13/2019 12:00:00, 1.136, 0.498
2/13/2019 13:00:00, 0.888, 0.517
2/13/2019 14:00:00, 1.240, 1.223
...
12/31/2019 23:00:00, ...
我是 Python 和 Pandas 的新手,到目前为止,这是我从其他 Stack Exchange 答案中总结出来的。我被卡住了,不知道我是否过于复杂了,或者是否已经有更简单的方法或程序可以做到这一点。
import os
import pandas as pd
import glob
import numpy as np
from pandas import ExcelWriter
path = 'C:\\Users\\CMBel\\Python Scripts'
allFiles = glob.glob(os.path.join(path,'*.csv'))
importColumnFields=['METER_ID','INTERVAL_DATE','INTERVAL_TIME','ENERGY']
newDateIDX=pd.date_range(start='1/1/2019 00:00:00',end='12/31/2019 23:00:00',freq='H')
np_array_list = []
for file_ in allFiles:
df = pd.read_csv(file_, skipinitialspace=True, usecols=importColumnFields, parse_dates=[[2,3]]) #import files and parse INTERVAL_DATE and INTERVAL_TIME together
df = df.reindex(newDateIDX, fill_value=0) #Re-index to the final Excel's year long index
# ?? Not sure where to go from here or if I am on the right track
np_array_list.append(df.as_matrix(),axis=1) #Append new ENERGY columns horizontally
np_array_list.to_excel('TestExport.xlsx',index_label='DATETIME')
任何帮助,想法,指针将不胜感激。
解决方案
首先向每个数据框添加一列。举个简单的例子,我将您的第一个 csv、df1 和第二个 csv 称为 df2。然后将数据集附加在一起。最后,您可以制作数据透视表。这应该让你得到你正在寻找的东西。
#Make datetime
df1['DateTime']=df1['INTERVAL_DATE']+" "+df1['INTERVAL_TIME']
df2['DateTime']=df2['INTERVAL_DATE']+" "+df2['INTERVAL_TIME']
#Append both datasets together
df3=df1.append(df2,ignore_index=True)
df3
#Pivot
pd.pivot_table(df3,values='ENERGY',index='DateTime',columns=['METER_ID']).reset_index()
推荐阅读
- blazor - 未处理的异常呈现组件:“<”是 Blazor WASM 值的无效开始
- javascript - YT 播放器在悬停时删除个人资料图片和 youtube 徽标
- python - 将 PySimpleGUI 窗口变量导入另一个文件
- microsoft-graph-api - 当我的机器人安装到新团队时,我不会收到 conversationUpdate (membersAdded) 事件有什么原因吗?
- tcp - Wireshark - TCP SYN、SYN ACK 和来自服务器的确认号
- python - 使用 Docker 部署烧瓶应用程序失败并显示“context.load_cert_chain('cert.pem','key.pem') FileNotFoundError: [Errno 2]”
- javascript - Todolist 中的 Sortable.js
- java - 如何使用递归方法在 ArrayList 上保留不同的值?
- image - 如何在 Matlab 中仅使用 affine2d 和 transformPointsForward 旋转图像?
- java - 单击按钮时未删除 JLabel