296 lines
7.7 KiB
Markdown
296 lines
7.7 KiB
Markdown
# 无人机数据处理工具
|
||
|
||
将Excel格式的无人机测量数据转换为GasFlux标准输入格式的完整解决方案。
|
||
|
||
## 📋 处理流程
|
||
|
||
### 输入数据格式
|
||
Excel文件必须包含以下列(顺序可以不同):
|
||
|
||
| 列名 | 数据类型 | 说明 |
|
||
|------|----------|------|
|
||
| `日期` | 字符串 | 日期 (YYYY-MM-DD 或 YYYY/MM/DD) |
|
||
| `时间` | 字符串 | 时间 (HH:MM:SS 或 H:MM:SS) |
|
||
| `经度` | 数值 | GPS经度坐标 (原始大数值) |
|
||
| `纬度` | 数值 | GPS纬度坐标 (原始大数值) |
|
||
| `高程` | 数值 | 飞行器高程 |
|
||
| `融合高程` | 数值 | 融合后的海拔高度 |
|
||
| `速度x` | 数值 | 东向速度分量 |
|
||
| `速度y` | 数值 | 北向速度分量 |
|
||
| `速度z` | 数值 | 垂直速度分量 |
|
||
| `四元数_q0-q3` | 数值 | 姿态四元数 |
|
||
| `pitch` | 数值 | 俯仰角 |
|
||
| `roll` | 数值 | 横滚角 |
|
||
| `yaw` | 数值 | 偏航角 |
|
||
| `CH4` | 数值 | 甲烷浓度 |
|
||
| `H2O` | 数值 | 水蒸气浓度 |
|
||
| `修正风向` | 数值 | 修正后的风向 |
|
||
| `修正风速` | 数值 | 修正后的风速 |
|
||
| `原始风向` | 数值 | 原始风向 |
|
||
| `原始风速` | 数值 | 原始风速 |
|
||
| `风温` | 数值 | 风温 (温度) |
|
||
|
||
## 🔄 处理步骤详解
|
||
|
||
### 1. 列删除
|
||
自动删除以下不需要的列:
|
||
- `高程`, `速度x`, `速度y`, `速度z`
|
||
- `四元数_q0`, `四元数_q1`, `四元数_q2`, `四元数_q3`
|
||
- `pitch`, `roll`, `yaw`
|
||
- `H2O`, `原始风向`, `原始风速`
|
||
|
||
### 2. 时间修正
|
||
根据文件名提取小时信息并修正时间列:
|
||
|
||
**文件名示例**: `08_34_01_间隔高度5m.xlsx`
|
||
- 提取: `08` (小时)
|
||
- 时间转换: `0:34:01` → `08:34:01`
|
||
|
||
### 3. 坐标转换
|
||
经纬度坐标除以 `10^7` 进行单位转换:
|
||
```
|
||
原始经度: 1157855289 → 转换后: 115.7855289
|
||
原始纬度: 403491370 → 转换后: 40.3491370
|
||
```
|
||
|
||
### 4. 气压计算(智能优化)
|
||
使用 `qiya.py` 模块智能计算地面气压,支持两种计算模式:
|
||
|
||
#### 🎯 三级智能计算策略
|
||
- **高度变化小**(默认容差≤10米):只计算一次平均气压,应用到所有行
|
||
- **中等变化**:使用高度分档策略,每个档位计算一次气压
|
||
- **高度变化大**:逐行计算气压,支持进度条显示
|
||
|
||
#### 📏 高度分档优化
|
||
- **分档间隔**:默认2米一个档位(可自定义)
|
||
- **档位计算**:每个档位使用中间高度和平均位置计算一次气压
|
||
- **减少API调用**:大幅降低重复计算,提高效率
|
||
|
||
#### 📊 计算参数
|
||
- **日期格式**: 转换为 `YYYY-MM-DD`(自动提取日期部分)
|
||
- **时间格式**: 提取小时部分 `HH`
|
||
- **海拔高度**: 使用 `融合高程` 列或档位中心高度
|
||
- **API调用**: Open-Meteo 历史天气数据
|
||
- **进度条**: 自动显示计算进度(需要安装tqdm)
|
||
|
||
#### ⚙️ 自定义参数
|
||
```python
|
||
# 自定义参数
|
||
df = calculate_pressure(
|
||
df,
|
||
max_samples=None,
|
||
height_tolerance=10.0, # 高度变化容差
|
||
height_bin_size=2.0 # 高度分档间隔
|
||
)
|
||
```
|
||
|
||
### 5. 高度调整
|
||
对 `融合高程` 进行基准调整:
|
||
```
|
||
调整后高度 = 原始高度 - 最小高度
|
||
```
|
||
|
||
### 6. 时间戳融合
|
||
将 `日期` 和 `时间` 列合并:
|
||
```
|
||
输入: 日期="2024-01-15", 时间="08:34:01"
|
||
输出: timestamp="2024-01-15 08:34:01"
|
||
```
|
||
|
||
### 7. 字段重命名
|
||
转换为GasFlux标准字段名:
|
||
|
||
| 原始字段 | GasFlux字段 | 数据类型 |
|
||
|----------|-------------|----------|
|
||
| `日期+时间` | `timestamp` | datetime |
|
||
| `经度` | `latitude` | float |
|
||
| `纬度` | `longitude` | float |
|
||
| `融合高程` | `height_ato` | float |
|
||
| `修正风向` | `windir` | float |
|
||
| `修正风速` | `windspeed` | float |
|
||
| `风温` | `temperature` | float |
|
||
| `气压计算结果` | `pressure` | float |
|
||
| `CH4` | `ch4` | float |
|
||
|
||
## 🚀 使用方法
|
||
|
||
### 1. 交互式输入模式(推荐新用户)
|
||
```bash
|
||
# 直接运行脚本,会自动进入交互式模式
|
||
python data_processor.py
|
||
|
||
# 或者明确指定交互式模式
|
||
python data_processor.py --interactive
|
||
```
|
||
|
||
在交互式模式下,程序会提示您:
|
||
- 输入Excel文件路径
|
||
- 指定输出CSV文件路径(可选)
|
||
- 确认处理参数
|
||
|
||
### 2. 命令行参数模式
|
||
```bash
|
||
# 基本用法
|
||
python data_processor.py your_data.xlsx
|
||
|
||
# 指定输出路径
|
||
python data_processor.py input.xlsx -o output.csv
|
||
|
||
# 查看帮助
|
||
python data_processor.py --help
|
||
```
|
||
|
||
### 3. Python脚本直接调用(推荐)
|
||
|
||
```python
|
||
# 最简单的方式
|
||
from src.gasflux.data_processor import process_file
|
||
|
||
# 处理文件并返回DataFrame
|
||
df = process_file('your_data.xlsx')
|
||
|
||
# 或者指定输出文件名
|
||
df = process_file('input.xlsx', 'output.csv')
|
||
|
||
# 使用返回的DataFrame进行进一步分析
|
||
print(df.head())
|
||
print(df['ch4'].describe())
|
||
```
|
||
|
||
### 4. 完整使用脚本
|
||
复制以下代码到新文件(如 `process_my_data.py`):
|
||
|
||
```python
|
||
from src.gasflux.data_processor import process_file
|
||
|
||
# 修改这里的输入文件名
|
||
input_file = "08_34_01_间隔高度5m.xlsx" # 您的Excel文件名
|
||
output_file = "processed_data.csv" # 输出文件名(可选)
|
||
|
||
try:
|
||
df = process_file(input_file, output_file)
|
||
print("✅ 处理成功!")
|
||
print(f"数据形状: {df.shape}")
|
||
print(f"列名: {list(df.columns)}")
|
||
print(df.head())
|
||
except Exception as e:
|
||
print(f"❌ 处理失败: {e}")
|
||
```
|
||
|
||
### Python代码调用
|
||
|
||
```python
|
||
from src.gasflux.data_processor import process_excel_file
|
||
|
||
# 处理单个文件
|
||
df = process_excel_file('path/to/data.xlsx')
|
||
|
||
# 查看结果
|
||
print(df.head())
|
||
print(df.columns)
|
||
```
|
||
|
||
## 📊 输出格式
|
||
|
||
处理后的数据完全符合GasFlux输入要求:
|
||
|
||
```csv
|
||
timestamp,latitude,longitude,height_ato,windspeed,windir,temperature,pressure,ch4
|
||
2024-01-15 08:34:01,115.785529,40.349137,10.5,3.2,180.5,22.3,1013.25,2.15
|
||
2024-01-15 08:34:02,115.785530,40.349138,10.8,3.1,181.2,22.4,1013.26,2.18
|
||
...
|
||
```
|
||
|
||
## ⚙️ 配置选项
|
||
|
||
### 文件名格式
|
||
脚本根据文件名自动提取时间信息:
|
||
- 格式: `{HH}_{MM}_{SS}_{其他信息}.xlsx`
|
||
- 示例: `08_34_01_间隔高度5m.xlsx` → 小时=08
|
||
|
||
### 气压计算
|
||
- 默认只计算前20行数据(避免过多API调用)
|
||
- 可以修改 `max_samples` 参数调整计算数量
|
||
|
||
## 🔧 依赖要求
|
||
|
||
```bash
|
||
pip install pandas openpyxl requests
|
||
```
|
||
|
||
确保GasFlux的`qiya.py`模块可用。
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
### 数据质量
|
||
- 确保Excel文件格式正确
|
||
- 检查日期时间格式
|
||
- 验证经纬度坐标范围
|
||
|
||
### API限制
|
||
- Open-Meteo有每日请求限制
|
||
- 批量处理时注意请求频率
|
||
- 网络连接稳定很重要
|
||
|
||
### 内存使用
|
||
- 大文件处理时注意内存占用
|
||
- 可以分批处理超大数据集
|
||
|
||
## 🎯 应用场景
|
||
|
||
### 无人机通量测量
|
||
1. **数据采集**: 无人机飞行收集原始数据
|
||
2. **数据处理**: 使用本脚本转换为标准格式
|
||
3. **通量计算**: 输入GasFlux进行气体通量分析
|
||
|
||
### 数据预处理工作流
|
||
```
|
||
原始Excel → 数据处理脚本 → GasFlux格式 → 通量计算 → 结果分析
|
||
```
|
||
|
||
## 📈 处理结果验证
|
||
|
||
处理完成后检查:
|
||
- ✅ 时间戳格式正确 (YYYY-MM-DD HH:MM:SS)
|
||
- ✅ 经纬度坐标合理范围
|
||
- ✅ 高度值从0开始 (已减去最小值)
|
||
- ✅ 气压值在合理范围 (900-1100 hPa)
|
||
- ✅ 所有必需字段都存在
|
||
|
||
## 🛠️ 故障排除
|
||
|
||
### 常见问题
|
||
|
||
#### 1. 文件读取错误
|
||
```
|
||
确保Excel文件未损坏,列名与预期一致
|
||
```
|
||
|
||
#### 2. 时间格式错误
|
||
```
|
||
检查文件名格式,确包含小时信息 (HH_MM_SS...)
|
||
```
|
||
|
||
#### 3. 气压计算失败
|
||
```
|
||
检查网络连接,确认日期格式正确
|
||
```
|
||
|
||
#### 4. 坐标转换异常
|
||
```
|
||
验证经纬度数据是数值类型,不是字符串
|
||
```
|
||
|
||
## 📞 支持
|
||
|
||
如遇问题,请检查:
|
||
1. 输入数据格式是否正确
|
||
2. 网络连接是否正常
|
||
3. GasFlux依赖是否完整安装
|
||
4. Python版本兼容性
|
||
|
||
---
|
||
|
||
**版本**: 1.0.0
|
||
**最后更新**: 2024年12月
|