对CSV格式的数据文件进行插值处理

使用Python程序,实现对一个较短的csv文件,进行差值处理,并绘制GUI界面;

这个程序是一个使用Python的Tkinter库构建的GUI应用程序,用于对CSV格式的数据文件进行插值处理。下面我会逐步解释程序的各个部分和功能:

1. 导入模块:

python
import tkinter as tk
from tkinter import filedialog
import os
import pandas as pd
import numpy as np

程序开始时,导入了需要使用的各种模块,包括Tkinter(用于GUI界面构建)、文件对话框模块(用于选择文件夹)、操作系统模块(用于文件路径操作)、Pandas(用于数据处理)和NumPy(用于数值计算)。

2. 插值函数 `interpolate_data`:

这个函数从给定的输入文件中读取CSV格式的数据,进行插值处理,并将结果保存到输出文件中。主要步骤包括:

- 读取输入文件中的数据,并提取时间、X、Y和Z列的数据。
- 计算已有行数和需要插值的新行数。
- 生成一些随机索引,用于选择已有数据中的随机行。
- 生成随机时间,并使用 `np.interp` 函数基于时间对X、Y和Z数据进行线性插值。
- 合并原有数据和插值生成的数据。
- 对合并后的数据按时间进行排序。
- 创建一个新的DataFrame并保存为输出文件。

3. 文件夹处理函数 `process_folder`:

这个函数接受一个文件夹路径作为输入,遍历文件夹中的所有文件,对其中的CSV文件进行插值处理。对于每个CSV文件,它会调用 `interpolate_data` 函数来进行插值,并根据生成的文件名保存结果。

4. 生成输出文件名函数 `generate_output_filename`:

给定一个输入文件名,这个函数会生成一个对应的输出文件名,格式为 "800_原文件名.csv",其中 "800" 表示插值后数据的目标行数。

5. 文件夹浏览函数 `browse_folder`:

这个函数使用文件对话框来让用户选择一个文件夹。选择文件夹后,它会调用 `process_folder` 函数对选中文件夹内的CSV文件进行插值处理,并在完成后更新一个标签,显示插值操作已完成。

6. 创建GUI窗口和界面元素:

- 创建一个Tkinter窗口并设置标题为 "CSV数据插值工具"。
- 创建一个按钮 "选择文件夹",点击按钮后会调用 `browse_folder` 函数。
- 创建一个标签用于显示操作结果。

7. 主事件循环:

最后,通过调用 `root.mainloop()` 启动Tkinter的主事件循环,使程序开始监听和响应用户交互事件,保持GUI界面的交互性。

总体来说,这个程序通过Tkinter构建了一个简单的GUI界面,让用户可以选择文件夹,对文件夹中的CSV文件进行插值操作,并在界面上显示操作结果。插值操作会生成新的CSV文件,使数据行数达到800行。

得到最终完整程序

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tkinter as tk
from tkinter import filedialog
import os
import pandas as pd
import numpy as np

def interpolate_data(input_filename, output_filename):
    desired_row_count = 800
    
    data = pd.read_csv(input_filename)
    time = data['Time']
    x = data['X']
    y = data['Y']
    z = data['Z']

    num_existing_rows = len(data)
    num_new_rows = desired_row_count - num_existing_rows
    
    random_indices = np.random.randint(0, num_existing_rows, num_new_rows)
    random_time = np.random.uniform(time.min(), time.max(), num_new_rows)
    random_x = np.interp(random_time, time, x)
    random_y = np.interp(random_time, time, y)
    random_z = np.interp(random_time, time, z)
    
    new_time = np.concatenate((time, random_time))
    new_x = np.concatenate((x, random_x))
    new_y = np.concatenate((y, random_y))
    new_z = np.concatenate((z, random_z))
    
    sorted_indices = np.argsort(new_time)
    new_time = new_time[sorted_indices]
    new_x = new_x[sorted_indices]
    new_y = new_y[sorted_indices]
    new_z = new_z[sorted_indices]

    new_data = pd.DataFrame({'Time': new_time, 'X': new_x, 'Y': new_y, 'Z': new_z})
    new_data.to_csv(output_filename, index=False)

def process_folder(folder_path):
    for filename in os.listdir(folder_path):
        if filename.endswith(".csv"):
            input_file_path = os.path.join(folder_path, filename)
            output_file_path = generate_output_filename(input_file_path)
            interpolate_data(input_file_path, output_file_path)

def generate_output_filename(input_filename):
    dirname, filename = os.path.split(input_filename)
    base_filename, extension = os.path.splitext(filename)
    output_filename = os.path.join(dirname, f"800_{base_filename}{extension}")
    return output_filename

def browse_folder():
    folder_path = filedialog.askdirectory()
    process_folder(folder_path)
    result_label.config(text="插值操作已完成")

# 创建GUI窗口
root = tk.Tk()
root.title("CSV数据插值工具")

# 文件夹选择部分
folder_button = tk.Button(root, text="选择文件夹", command=browse_folder)
folder_button.pack()

# 结果提示
result_label = tk.Label(root, text="")
result_label.pack()

root.mainloop()

猜你喜欢

转载自blog.csdn.net/weixin_45498383/article/details/132475652