Chapter 5:按站点分组的雨滴谱降水过程切分
1.按站点分组:把所有数据分成多个组,每组对应一个站点。
2.组内按时间排序:在每个站点内部,把数据按时间从早到晚排好。
3.在每个站点内部,切分降水过程:断点<12分钟可拼接,断点≥12分钟切开,每段独立连续时间>=60分钟。
4.汇总所有站点的有效记录:最终得到6725条序列(来自17个站点)。
具体分解:
1.按站点分组:把所有数据分成多个组,每组对应一个站点。
2.组内按时间排序:在每个站点内部,把数据按时间从早到晚排好。

import pandas as pd import glob import os # ============================================================ # 1. 设置路径 # ============================================================ # 你存放所有 CSV 文件的文件夹路径(改成你自己的) data_dir = r'D:/lianxi/' # 输出文件夹(合并后的文件存这里) output_dir = r'D:/lianxi/output/' os.makedirs(output_dir, exist_ok=True) # ============================================================ # 2. 找到所有 CSV 文件 # ============================================================ all_files = glob.glob(os.path.join(data_dir, '*.csv')) print(f'共找到 {len(all_files)} 个 CSV 文件') # ============================================================ # 3. 按站点分组:从文件名中提取站点编号(第一个 '-' 之前的部分) # ============================================================ station_files = {} for f in all_files: filename = os.path.basename(f) # 提取站点编号:文件名第一个 '-' 之前的部分 station_id = filename.split('-')[0] if station_id not in station_files: station_files[station_id] = [] station_files[station_id].append(f) print(f'共找到 {len(station_files)} 个站点') for sid, files in station_files.items(): print(f' 站点 {sid}: {len(files)} 个文件') # ============================================================ # 4. 逐个站点合并 + 按 time 列排序 # ============================================================ for station_id, files in station_files.items(): print(f'\n正在处理站点 {station_id} ...') dfs = [] for f in files: try: df = pd.read_csv(f) dfs.append(df) except Exception as e: print(f' 读取失败: {f}, 错误: {e}') if not dfs: print(f' 站点 {station_id} 没有有效数据,跳过') continue # 合并 merged = pd.concat(dfs, ignore_index=True) # 按 time 列排序(核心步骤:只看 csv 内部的 time 列) merged['time'] = pd.to_datetime(merged['time'], errors='coerce') # 检查无效时间 invalid_time = merged['time'].isna().sum() if invalid_time > 0: print(f' 警告: 有 {invalid_time} 行时间解析失败,已删除') merged = merged.dropna(subset=['time']) # 排序 merged = merged.sort_values('time').reset_index(drop=True) # 去重(同一时间可能重复,保留第一条) before_dedup = len(merged) merged = merged.drop_duplicates(subset='time', keep='first').reset_index(drop=True) after_dedup = len(merged) if before_dedup != after_dedup: print(f' 去重: {before_dedup} -> {after_dedup} 行') # 保存 output_path = os.path.join(output_dir, f'{station_id}_all.csv') merged.to_csv(output_path, index=False) print(f' 已保存: {output_path} ({len(merged)} 行)') print('\n全部完成!')


浙公网安备 33010602011771号