Python 插值代码实现并将数据多列写入csv文件
def interpolation(n_days_filename_csv, ): #插值成一分钟的数据
# 取出读取的n天的数据为数据插值做准备
data = pd.read_csv(filepath_or_buffer=n_days_filename_csv, usecols=[0, 1, 2, 3]) # dataframe类型
# time = data.iloc[:, 0].values.astype('int') # 因为新写入的ndays的csv文件没有列名
# x = data.iloc[:, 1].values.astype('float64')
# y = data.iloc[:, 2].values.astype('float64')
# z = data.iloc[:, 3].values.astype('float64')
# print(time.shape, x.shape) #time.shape(len(time), 1) x.shape(len(time), 1)
time = data.loc[:, ['time']].values.astype('int')
x = data.loc[:, ['x']].values.astype('float64')
y = data.loc[:, ['y']].values.astype('float64')
z = data.loc[:, ['z']].values.astype('float64')
print('插值前取数据集3天的x轴的数据的batchmark的rmse',
math.sqrt(mean_squared_error(x[look_back:], x[look_back - 1:-1])))
#进行插值
time =time.reshape(-1)
x =x.reshape(-1)
y =y.reshape(-1)
z =z.reshape(-1)
# linear , quadratic二次插值
f_x = interpolate.interp1d(time, x, kind= "linear") #线性插值
f_y = interpolate.interp1d(time, y, kind= "linear")
f_z = interpolate.interp1d(time, z, kind= "linear")
# for i in range(len(time) - 1): #多得到的采样频率都是一定的,没必要进行多次循环,大于一分钟的进行插值
if time[len(time) - 2] - time[len(time) - 3] >= 60:
time_new = [j for j in range(time[0], time[len(time) - 1], 60)] # for j in range(time[i], time[i+1], 60):
#range(start, stop[, step]) -> range object
time_new.append(time[len(time) - 1])
x_new = f_x(time_new)
y_new = f_y(time_new)
z_new = f_z(time_new)
time_new = np.array(time_new) #将time_new, x_new等从list转化为numpy数组
#写入csv文件,多列写入
csvfile = open("new_datas_linear.csv", 'wt' ,encoding="UTF8", newline='') #
writer=csv.writer(csvfile, delimiter=",")
header=['time_new','x_new', 'y_new', 'z_new']
csvrow1=[]
csvrow2=[]
csvrow3=[]
csvrow4=[]
for i in range(len(time_new)):
csvrow1.append(time_new[i])
csvrow2.append(x_new[i])
csvrow3.append(y_new[i])
csvrow4.append(z_new[i])
writer.writerow(header)
writer.writerows(zip(csvrow1, csvrow2, csvrow3, csvrow4))
csvfile.close()
new_data_filename = "new_datas_linear.csv"
return new_data_filename