excel数据处理
现有问题如下:
有一份excel表格(csv文件)包含了报警信息,第四列是时间序列,
如: 2019/3/1 5:35:50
还有一个文件夹有多份ecxel表格,里面有2019/3/1 到2019/3/31号的数据,每份Excel表格里有一天的数据,时间以分钟为间隔,如:2019/3/4 0:01:57,目标是根据报警信息的时间去把对应的下一时刻的相关数据进行修改
具体是使用Python时间戳做的,代码如下:
"""
根据一个csv文件中的日期寻找另一个csv文件中对应日期的数据并修改
"""
import pandas as pd
import time
import os
#获取告警记录的时间列表
def getAlarmDates(filename):
# 注意此处文件路径的表示,文件格式及编码类型,encoding="gbk",编码类型设置不对会导致如中文乱码之类的问题
df_alarm = pd.read_csv(filename, encoding="gbk")
# 获取报警日间,以秒为单位(对excel文件修改其编码方式为ut-f8且设置时间栏的单元格格式,使其能够显示秒
# 3/1到3/31号的时间数据,即第三列,242-410行
alarm_dates = df_alarm.iloc[242:410, 3]
return alarm_dates
#将某一天csv文件读取到dataframe中,并获取该天的时间序列
def getDates(filename):
# 注意此处文件路径的表示,文件格式及编码类型,encoding="unicode_escape"可避免部分ut-f8的编码错误
df_data = pd.read_csv(filename, encoding="gbk")
# 获取报警日间,以秒为单位(对excel文件修改其编码方式为ut-f8且设置时间栏的单元格格式,使其能够显示秒
# 3/1到3/31号的时间数据,即第三列,242-410行
dates = df_data.iloc[:,[0]]
return dates,df_data
#获取某一天的时间戳
def getTimeStamp(dates):
strtimes = ''
times = []
days=[]
for i in range(len(dates.values)):
strtimes = ''.join(dates.values[i]) # 转换成字符串类型
timei = time.strptime(strtimes, "%Y/%m/%d %H:%M:%S") # 将2019/3/1 2;33;30的时间格式转换成date结构类型
time_stampi = time.mktime(timei) # 转换成时间戳
times.append(time_stampi)
return times
alarm_dates=getAlarmDates('D:/start/batterys/alarm2.csv')
alarm_times=getTimeStamp(alarm_dates)
def changeData(indexs,df_data):
for index in indexs:
orindex = index # 保存原索引
index -= 1
# 如果上一时刻簇电流为0,向上一时刻寻找
while (df_data.iloc[index, 23] == 0):
index -= 1
# 修改v187电压值
df_data.iloc[orindex, 226] = 3.65
if (df_data.iloc[index, 23] > 0):
df_data.iloc[orindex, 23] = 148
else:
df_data.iloc[orindex, 23] = -148
return df_data
#构造时间序列,与报警日期一致
def getTimeRange():
time1=time.strptime('2019/3/1 0:00:00', "%Y/%m/%d %H:%M:%S")
time_stamp1 = time.mktime(time1)
days=[]
list1=list(range(0,28))
list1.remove(6)
list1.remove(7)
list1.remove(10)
list1.remove(17)
for i in list1:
time_stamp1 +=86400*i #一天的时间间隔86400
days.append(time_stamp1)
return days
days=getTimeRange()
#对整个文件夹中的数据进行批量修改
def changeAlldata():
path = 'D:/start/batterys/201903'
path_list = os.listdir(path)
#对每一份文件(每一天的数据)进行处理
k=0
for filename in path_list:
datei, df_datai = getDates(path+"/"+filename)
times=getTimeStamp(datei)
indexs = []
flag = False
for j in range(len(alarm_times)):
#只对当天的报警数据进行处理,获得报警数据对应的索引序列indexs
if(alarm_times[j]<days[k+1]):
for i in range(len(times)):
if (times[i] > alarm_times[j]):
indexs.append(i)
flag = True
break
if (flag):
flag = False
else:
break
df_datai=changeData(indexs,df_datai)
k=k+1
df_datai.to_csv(filename, encoding="gbk")
changeAlldata()