ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-11-15 15:03:28  阅读:220  来源: 互联网

标签:文件 loc Python average 一列 starttime endtime data


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

文件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

标签:文件,loc,Python,average,一列,starttime,endtime,data
来源: https://blog.csdn.net/Han_torch/article/details/121333956

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有