用python,完成以下代码,并显示每一步的完成进度。现在有30个csv文件,名称分别为yuchuli4.1、yuchuli4.2、yuchuli4.3以此类推到yuchuli4.30,他们的路径分别为cygnss/预处理/预处理 分/yuchuli4.1.csv,cygnss/预处理/预处理 分/yuchuli4.2.csv以此类推到cygnss/预处理/预处理 分/yuchuli4.30.csv,这些csv文件都是N乘17的矩阵,另外还有一个名称为Total_water_level的csv文件,其路径为Total water level data/Extraction results of original total water level data/Total_water_level.csv,是N乘4的矩阵。这30个csv文件和名称为Total_water_level的csv文件都含有名称为“sp_lat”、“sp_lon”、“ddm_timestamp_utc”数据,请根据他们的“sp_lat”、“sp_lon”、“ddm_timestamp_utc”数据,用最邻近插值法,将名称为Total_water_level的csv文件插到这30个csv文件中,将名称为Total_water_level的csv文件中的名称为“waterlevel”数据加到这30个csv文件的最后一列,对于yuchuli中的每一行时间戳(ddm_timestamp_utc)数据,找到Total_water_level中与之最邻近的时间戳(ddm_timestamp_utc)的点,然后在该时间戳下,找到sp_lat和sp_lon最接近的点,并且如果该点的纬度差和经度差都在1度以内,则取该值;否则不插值,并删除该行。最后将没加上“waterlevel”数据的行剔除,将加完waterlevel数据且剔除完数据的名称为yuchuli4.1的csv文件命名为pipei4.1的csv文件保存到D:\李劲阳毕设\数据匹配\分,将加完waterlevel数据的名称为yuchuli4.2的csv文件命名为pipei4.2的csv文件保存到D:\李劲阳毕设\数据匹配\分,将加完waterlevel数据的名称为yuchuli4.3的csv文件命名为pipei4.3的csv文件保存到D:\李劲阳毕设\数据匹配\分,以此类推,将加完waterlevel数据的名称为yuchuli4.30的csv文件命名为pipei4.30的csv文件保存到D:\李劲阳毕设\数据匹配\分。其中pipei4.1到pipei4.30中的4.1到4.30表示日期,最后将生成的名称为pipei4.1到pipei4.30的csv文件按日期顺序合并成一个名称为pipei4的csv文件,保存到D:\李劲阳毕设\数据匹配\总 import pandas as pd import numpy as np import os from scipy.spatial import KDTree from tqdm import tqdm # ================================================================= # 步骤1:加载总水位数据并建立时空索引 # ================================================================= print("【步骤1/5】正在加载水位总数据...") total_water = pd.read_csv(r"Total water level data/Extraction results of original total water level data/Total_water_level.csv") # 预处理时间戳(假设时间戳为Unix时间格式) total_water['timestamp_group'] = total_water['ddm_timestamp_utc'].astype(int) timestamp_groups = {} for ts, group in tqdm(total_water.groupby('timestamp_group'), desc="建立时间戳索引"): coords = group[['sp_lat', 'sp_lon']].values timestamp_groups[ts] = { 'data': group, 'kdtree': KDTree(coords) } # ================================================================= # 步骤2:定义匹配函数 # ================================================================= def match_water_level(row, ts_group): """ 核心匹配函数 """ # 在时间维度上匹配 matched_ts = min(ts_group.keys(), key=lambda x: abs(x - row['ddm_timestamp_utc'])) time_diff = abs(matched_ts - row['ddm_timestamp_utc']) # 在空间维度匹配 target_group = ts_group[matched_ts] dist, idx = target_group['kdtree'].query([[row['sp_lat'], row['sp_lon']]], k=1) # 检查地理误差 if dist[0] > 1: # 1度阈值 return np.nan return target_group['data'].iloc[idx[0]]['waterlevel'] # ================================================================= # 步骤3:处理30个文件 # ================================================================= output_dir = r"D:\李劲阳毕设\数据匹配\分" os.makedirs(output_dir, exist_ok=True) print("\n【步骤2/5】开始处理30个数据文件:") for i in tqdm(range(1, 31), desc="整体进度"): # 读取原始文件 file_num = f"4.{i}" input_path = f"cygnss/预处理/预处理 分/yuchuli{file_num}.csv" df = pd.read_csv(input_path) # 执行匹配 tqdm.write(f"正在处理 yuchuli{file_num}.csv...") df['waterlevel'] = df.apply(lambda row: match_water_level(row, timestamp_groups), axis=1) # 数据清洗 df_clean = df.dropna(subset=['waterlevel']).copy() # 保存处理结果 output_path = os.path.join(output_dir, f"pipei{file_num}.csv") df_clean.to_csv(output_path, index=False) # ================================================================= # 步骤4:合并所有文件 # ================================================================= print("\n【步骤3/5】开始合并数据文件...") merged_data = pd.DataFrame() file_list = [f"pipei4.{i}.csv" for i in range(1,31)] for fname in tqdm(sorted(file_list, key=lambda x: float(x.split('.')[1])), desc="合并进度"): file_path = os.path.join(output_dir, fname) df_part = pd.read_csv(file_path) merged_data = pd.concat([merged_data, df_part], ignore_index=True) # ================================================================= # 步骤5:保存最终结果 # ================================================================= print("\n【步骤4/5】正在保存最终合并文件...") final_output = r"D:\李劲阳毕设\数据匹配总\pipei4.csv" merged_data.to_csv(final_output, index=False) print("\n✅ 处理完成!最终文件已保存至:", final_output) 现在不需要将生成的名称为pipei4.1到pipei4.30的csv文件按日期顺序合并成一个名称为pipei4的csv文件,保存到D:\李劲阳毕设\数据匹配\总,因此为我改进以上代码并生成最终完整的代码给我
时间: 2025-06-05 09:55:19 浏览: 10
以下是改进后的完整代码,去除了合并步骤,只保留将每个文件单独处理并保存为 `pipei4.x.csv` 的功能:
```python
import pandas as pd
import numpy as np
import os
from scipy.spatial import KDTree
from tqdm import tqdm
# =================================================================
# 步骤1:加载总水位数据并建立时空索引
# =================================================================
print("【步骤1/4】正在加载水位总数据...")
total_water = pd.read_csv(r"Total water level data/Extraction results of original total water level data/Total_water_level.csv")
# 预处理时间戳(假设时间戳为Unix时间格式)
total_water['timestamp_group'] = total_water['ddm_timestamp_utc'].astype(int)
timestamp_groups = {}
for ts, group in tqdm(total_water.groupby('timestamp_group'), desc="建立时间戳索引"):
coords = group[['sp_lat', 'sp_lon']].values
timestamp_groups[ts] = {
'data': group,
'kdtree': KDTree(coords)
}
# =================================================================
# 步骤2:定义匹配函数
# =================================================================
def match_water_level(row, ts_group):
""" 核心匹配函数 """
# 在时间维度上匹配
matched_ts = min(ts_group.keys(), key=lambda x: abs(x - row['ddm_timestamp_utc']))
time_diff = abs(matched_ts - row['ddm_timestamp_utc'])
# 在空间维度匹配
target_group = ts_group[matched_ts]
dist, idx = target_group['kdtree'].query([[row['sp_lat'], row['sp_lon']]], k=1)
# 检查地理误差
if dist[0] > 1: # 1度阈值
return np.nan
return target_group['data'].iloc[idx[0]]['waterlevel']
# =================================================================
# 步骤3:处理30个文件
# =================================================================
output_dir = r"D:\李劲阳毕设\数据匹配\分"
os.makedirs(output_dir, exist_ok=True)
print("\n【步骤2/4】开始处理30个数据文件:")
for i in tqdm(range(1, 31), desc="整体进度"):
# 读取原始文件
file_num = f"4.{i}"
input_path = f"cygnss/预处理/预处理 分/yuchuli{file_num}.csv"
df = pd.read_csv(input_path)
# 执行匹配
tqdm.write(f"正在处理 yuchuli{file_num}.csv...")
df['waterlevel'] = df.apply(lambda row: match_water_level(row, timestamp_groups), axis=1)
# 数据清洗
df_clean = df.dropna(subset=['waterlevel']).copy()
# 保存处理结果
output_path = os.path.join(output_dir, f"pipei{file_num}.csv")
df_clean.to_csv(output_path, index=False)
print("\n✅ 处理完成!所有文件已保存至:", output_dir)
```
### 给出解释:
1. **删除了合并步骤**:原代码中包含一个将所有生成的 `pipei4.x.csv` 文件合并为单个文件的部分。根据您的需求,这部分已被移除。
2. **保持独立文件保存**:每处理完一个文件后,直接将其保存到指定目录下,文件名为 `pipei4.x.csv`。
3. **进度显示**:使用 `tqdm` 库显示每一步的进度条,方便用户了解程序运行状态。
---
阅读全文
相关推荐














