import os
import pandas as pd
from collections import defaultdict
# 设置文件目录
data_dir = r'D:\气象数据\日值降水、气温、蒸发_1951-1987\日值降水、气温、蒸发\降水'
output_dir = os.path.join(data_dir, '青海')
os.makedirs(output_dir, exist_ok=True)
# 定义要提取的区站号列表
target_stations = {
'52602', '52707', '52818', '52825', '52836', '52854', '52856', '52863', '52866', '52868', '52869',
'52875', '52876', '52877', '52908', '52941', '52943', '52955', '52957', '52963', '52968', '52972',
'52974', '56004', '56016', '56018', '56021', '56029', '56033', '56034', '56043', '56045', '56046',
'56065', '56067', '56125', '56151'
}
# 初始化一个defaultdict来存储每个区站号的数据
data_dict = defaultdict(pd.DataFrame)
# 遍历目录中的所有.xlsx文件
for filename in os.listdir(data_dir):
if filename.endswith('.xlsx'):
filepath = os.path.join(data_dir, filename)
df = pd.read_excel(filepath)
# 确保区站号为字符串类型
df['区站号'] = df['区站号'].astype(str)
# 筛选出目标区站号的数据
filtered_df = df[df['区站号'].isin(target_stations)]
# 将筛选后的数据添加到对应的区站号数据集中
for station_id, group in filtered_df.groupby('区站号'):
data_dict[station_id] = pd.concat([data_dict[station_id], group])
# 按区站号分组并保存到各自文件
for station_id, data in data_dict.items():
if not data.empty:
# 按年、月、日排序
data = data.sort_values(by=['年', '月', '日'])
# 保存到对应的文件
output_filepath = os.path.join(output_dir, f'{station_id}.xlsx')
data.to_excel(output_filepath, index=False)
print("数据处理完成!")
让我们逐个解析这段代码中每个函数的含义、用法,并举例说明:
1. **`os.makedirs(output_dir, exist_ok=True)`:**
- **含义:** 创建目录,包括所有必要的中间目录。如果目标目录已经存在,则不会引发异常。
- **用法:** `os.makedirs()` 函数用于创建目录,第一个参数是要创建的目录路径,第二个参数 `exist_ok=True` 表示如果目标目录已经存在,不会抛出异常。
- **示例:**
```python
import os
output_dir = r'D:\气象数据\日值降水、气温、蒸发_1951-1987\日值降水、气温、蒸发\降水\青海'
os.makedirs(output_dir, exist_ok=True)
```
2. **`pd.read_excel(filepath)`:**
- **含义:** 从 Excel 文件中读取数据并返回 DataFrame。
- **用法:** `pd.read_excel()` 函数用于从 Excel 文件中读取数据,参数是 Excel 文件的路径。
- **示例:**
```python
import pandas as pd
filepath = r'D:\气象数据\日值降水、气温、蒸发_1951-1987\日值降水、气温、蒸发\降水\example.xlsx'
df = pd.read_excel(filepath)
```
3. **`df['区站号'].astype(str)`:**
- **含义:** 将 DataFrame 中的某一列数据类型转换为字符串类型。
- **用法:** 使用 DataFrame 的 `astype()` 方法将指定列的数据类型转换为字符串类型。
- **示例:**
```python
df['区站号'] = df['区站号'].astype(str)
```
4. **`df[df['区站号'].isin(target_stations)]`:**
- **含义:** 筛选出 DataFrame 中指定列的值在给定列表中的行。
- **用法:** 使用布尔索引和 `isin()` 方法来筛选数据。
- **示例:**
```python
target_stations = ['52602', '52707', '52818']
filtered_df = df[df['区站号'].isin(target_stations)]
```
5. **`pd.concat([data_dict[station_id], group])`:**
- **含义:** 将多个 DataFrame 连接(合并)成一个。
- **用法:** 使用 `pd.concat()` 函数将 DataFrame 连接在一起。
- **示例:**
```python
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
combined_df = pd.concat([df1, df2])
```
6. **`data.to_excel(output_filepath, index=False)`:**
- **含义:** 将 DataFrame 写入到 Excel 文件中。
- **用法:** 使用 DataFrame 的 `to_excel()` 方法将数据写入到 Excel 文件中。
- **示例:**
```python
data.to_excel('output.xlsx', index=False)
```
这些就是代码中每个函数的含义、用法及示例。通过理解这些函数的作用,你可以更好地理解整段代码的功能和执行流程。
7. **`data = data.sort_values(by=['年', '月', '日'])`:**
- **含义:** 对 DataFrame 按照指定列进行排序。
- **用法:** 使用 DataFrame 的 `sort_values()` 方法按照指定列对数据进行排序。
- **示例:**
```python
data = data.sort_values(by=['年', '月', '日'])
```
8. **`os.path.join(output_dir, f'{station_id}.xlsx')`:**
- **含义:** 将目录路径和文件名拼接成完整的文件路径。
- **用法:** 使用 `os.path.join()` 函数将目录路径和文件名拼接起来。
- **示例:**
```python
import os
output_dir = r'D:\output'
station_id = '52602'
output_filepath = os.path.join(output_dir, f'{station_id}.xlsx')
```
9. **`os.listdir(data_dir)`:**
- **含义:** 返回指定目录中的文件和子目录的列表。
- **用法:** 使用 `os.listdir()` 函数获取指定目录下的所有文件和子目录。
- **示例:**
```python
import os
data_dir = r'D:\气象数据\日值降水、气温、蒸发_1951-1987\日值降水、气温、蒸发\降水'
files = os.listdir(data_dir)
```
10. **`defaultdict(pd.DataFrame)`:**
- **含义:** 创建一个默认值为 DataFrame 的 defaultdict 对象。
- **用法:** 使用 `collections` 模块中的 `defaultdict` 类创建一个默认值为 DataFrame 的字典。
- **示例:**
```python
from collections import defaultdict
import pandas as pd
data_dict = defaultdict(pd.DataFrame)
```
11. **`shutil.move(source_file, target_folder)`:**
- **含义:** 将文件移动到目标文件夹。
- **用法:** 使用 `shutil.move()` 函数将指定文件移动到目标文件夹。
- **示例:**
```python
import shutil
source_file = r'D:\source\example.xlsx'
target_folder = r'D:\target'
shutil.move(source_file, target_folder)
```
这些是继续解析代码中每个函数的含义、用法及示例。通过理解这些函数,你可以更好地掌握代码的功能和执行流程。