根据一份excel表格中的时间批量修改多份excel文件中对应时间对应的数据

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值