背景是:多条跑道中都有对应的时间和速度,如何计算一段时间内所有跑道的平均速度?并添加到另外一个文件的新增列中。
文件1(data.csv)是月份总表,只有开始时间和结束时间。多个文件(12021-11-15.csv、22021-11-15.csv、32021-11-15.csv...)是日期表,只有一天的开始时间、结束时间、对应时刻速度。
多条跑道表中的数据如下(日期格式有两种):
时间 | 1.data |
2021-11-15 14:28:28 | 2 |
2021-11-15 14:38:28 | 3 |
时间 | 2.date |
2021/11/15 14:28:28 | 2.5 |
2021/11/15 14:38:28 | 3.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