Python计算多个文件一段时间内平均值并添加到文件1新增一列中

背景是:多条跑道中都有对应的时间和速度,如何计算一段时间内所有跑道的平均速度?并添加到另外一个文件的新增列中。

文件1(data.csv)是月份总表,只有开始时间和结束时间。多个文件(12021-11-15.csv、22021-11-15.csv、32021-11-15.csv...)是日期表,只有一天的开始时间、结束时间、对应时刻速度。

多条跑道表中的数据如下(日期格式有两种):

时间1.data
2021-11-15 14:28:282
2021-11-15 14:38:283
时间2.date
2021/11/15 14:28:282.5
2021/11/15 14:38:283.5

那么这十分钟内,跑道1的平均速度是2.5,跑道2的平均速度是3,总跑道的平均速度是2.75。

(1)读取文件1,并增加空列

df1['average']=' '

(2)读取文件1中的开始时间和结束时间

iloc主要用来提取行数据,详细用法可参考Pandas中loc和iloc函数用法详解(源码+实例) - 简书

然后因为每个文件的时间格式不太一致,统一以后只取秒钟之前的数据(看需求)

其中try和except用来处理这种情况非常合适!Python try except异常处理详解(入门必读)

(3)找到开始时间下的多个跑道文件

因为每一天的数据都在不同的文件中,所以根据(2)提取的开始时间,就看可以找到当天的数据。这里为了方便操作,如果开始时间和结束时间不在一个文件,速度直接视为0。

if int(starttime[8:10]) == int(endtime[8:10]):  # 不跨天

 (4)找到小文件下的开始和结束时间位置

start_loc = np.argwhere(timelist == starttime[-5:])[0][0]
end_loc = np.argwhere(timelist  == endtime[-5:])[0][0]

(5)求开始到结束时间内的平均速度(重点)

data_list = np.array(df_data[str(j+1)+'.data'].iloc[start_loc:end_loc+1])

 用第一次迭代来说明,这里就是取到总表文件1第一行的开始和结束时间,然后找到了各个小文件中对应时间段内的所有速度。

if len(data_list)==0:
        data_j=0
 else:
        data_j = sum(data_list)/len(data_list)

 如果该对应时间内未取到速度则视为0,其它情况就是速度总和除以速度个数。

(6)将计算出的平均速度添加到文件1的新增列中

循环前提前设定一个空数组,每次循环得到的速度添加到数组中,最后数组的长度应该和文件1的数据长度相同。

df1['average'] = average

import pandas as pd
import numpy as np
import os
import datetime as dt

df1 = pd.read_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data.csv',encoding = 'gbk')

df1['average']=''

data_path = r'C:/Users/hanhan/PycharmProjects/pythonProject/data/'

average = []
for i in range(len(df1)):
    starttime = df1['开始时间'].iloc[i]
    endtime = df1['结束时间'].iloc[i]

    #转换成Y-m-d H:M 字符串形式
    try:
        starttime = str(dt.datetime.strptime(starttime, '%Y-%m-%d %H:%M:%S'))[:-3]
    except:
        starttime = str(dt.datetime.strptime(starttime, '%Y/%m/%d %H:%M:%S'))[:-3]

    try:
        endtime = str(dt.datetime.strptime(endtime, '%Y-%m-%d %H:%M:%S'))[:-3]
    except:
        endtime = str(dt.datetime.strptime(endtime, '%Y/%m/%d %H:%M:%S'))[:-3]

    if int(starttime[8:10]) == int(endtime[8:10]):  # 不跨天
        for j in range(3):
            filename = str(j+1)+starttime[:10]+'.csv'
            df_data = pd.read_csv(os.path.join(data_path,filename),encoding='gb2312')
            df_data.rename(columns={'Unnamed: 0': '时间'}, inplace=True)
            timelist = np.array([s[-8:-3] for s in df_data['时间']]) #取小时:分钟
            # print(timelist)
            start_loc = np.argwhere(timelist==starttime[-5:])[0][0]
            end_loc = np.argwhere(timelist == endtime[-5:])[0][0]
            # print(start_loc)
            # print(end_loc)
            data_list = np.array(df_data[str(j+1)+'.data'].iloc[start_loc:end_loc+1])

            if len(data_list)==0:
                data_j=0
            else:
               data_j = sum(data_list)/len(data_list)
    else:
        lasu_j=0
    average.append(lasu_j)
    print('i=',i)
    print('average', average)
df1['average'] = average

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值