Chapter 5:按站点分组的雨滴谱降水过程切分

1.按站点分组:把所有数据分成多个组,每组对应一个站点。

2.组内按时间排序:在每个站点内部,把数据按时间从早到晚排好。

3.在每个站点内部,切分降水过程:断点<12分钟可拼接,断点≥12分钟切开,每段独立连续时间>=60分钟。

4.汇总所有站点的有效记录:最终得到6725条序列(来自17个站点)。

具体分解:

1.按站点分组:把所有数据分成多个组,每组对应一个站点。

2.组内按时间排序:在每个站点内部,把数据按时间从早到晚排好。

image

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全部完成!')

image

 

posted @ 2026-09-23 22:10  SuYue2990  Views(10)  Comments(0)    收藏  举报