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 = {
'51053','51058','51060','51068','51076','51087','51133','51137','51145','51156',
'51232','51238','51241','51243','51334','51357','51359','51367','51368','51369',
'51377','51378','51468','51469','51470','51477','51482','51526','51542','51567',
'51571','51572','51573','51627','51628','51636','51639','51656','51704','51705',
'51707','51709','51717','51720','51722','51730','51747','51765','51802','51810',
'51811','51814','51815','51818','51826','51827','51828','51829','51839','51855',
'51931','52101','52112','52118','52203','52313'
}
# 初始化一个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("数据处理完成!")
这段Python代码用于处理气象数据,其主要功能包括:
1. 设置文件目录:指定了输入数据所在的目录和输出数据要保存的目录。
2. 创建输出目录:如果输出目录不存在,则会创建该目录。
3. 定义要提取的区站号列表:即`target_stations`,其中包含了一系列要提取数据的区站号。
4. 初始化一个`defaultdict`来存储每个区站号的数据:使用`defaultdict`可以按照区站号存储数据,方便后续处理。
5. 遍历目录中的所有`.xlsx`文件:对于每个文件,读取其中的数据,并筛选出目标区站号的数据,将其添加到相应的区站号数据集中。
6. 按区站号分组并保存到各自文件:将每个区站号的数据按照年、月、日排序后,保存到对应的Excel文件中。
现在,让我们逐个解释每个函数的含义、用法,并通过一个例子进行说明:
```python
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)
```
- `os.path.join()`: 用于拼接路径,将`data_dir`和`'新疆'`连接成一个完整的路径。
- `os.makedirs()`: 用于创建目录,参数`exist_ok=True`表示如果目录已存在则不会抛出异常。
```python
# 定义要提取的区站号列表
target_stations = {
'51053','51058','51060','51068','51076','51087','51133','51137','51145','51156',
'51232','51238','51241','51243','51334','51357','51359','51367','51368','51369',
'51377','51378','51468','51469','51470','51477','51482','51526','51542','51567',
'51571','51572','51573','51627','51628','51636','51639','51656','51704','51705',
'51707','51709','51717','51720','51722','51730','51747','51765','51802','51810',
'51811','51814','51815','51818','51826','51827','51828','51829','51839','51855',
'51931','52101','52112','52118','52203','52313'
}
```
- `target_stations`: 是一个包含要提取数据的区站号的集合,每个区站号都是一个字符串。
```python
# 初始化一个defaultdict来存储每个区站号的数据
data_dict = defaultdict(pd.DataFrame)
```
- `defaultdict`: 是`collections`模块中的一种字典类型,它会在访问不存在的键时自动创建该键,并将其关联的值初始化为指定的类型,这里是`pd.DataFrame`(Pandas的DataFrame)。这样可以方便地按区站号存储数据。
```python
# 遍历目录中的所有.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])
```
- `os.listdir()`: 用于列出目录中的文件,返回一个包含文件名的列表。
- `pd.read_excel()`: 用于读取Excel文件,并将其解析为DataFrame。
- `df['区站号'].astype(str)`: 将DataFrame中的'区站号'列的数据类型转换为字符串类型。
- `df[df['区站号'].isin(target_stations)]`: 筛选出`target_stations`中包含的区站号对应的数据。
- `groupby('区站号')`: 对DataFrame按照'区站号'列进行分组。
- `pd.concat()`: 将多个DataFrame沿着指定轴(默认为行轴)拼接在一起。
```python
# 按区站号分组并保存到各自文件
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("数据处理完成!")
```
- `data_dict.items()`: 返回`data_dict`中每个键值对的键和值。
- `data.sort_values(by=['年', '月', '日'])`: 按照'年'、'月'、'日'列的值进行排序。
- `data.to_excel()`: 将DataFrame保存到Excel文件中,参数`index=False`表示不保存行索引。
这样,代码会根据给定的目录中的Excel文件,提取指定区站号的数据,并按照区站号分别保存到新的Excel文件中。
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 = {
'51053','51058','51060','51068','51076','51087','51133','51137','51145','51156',
'51232','51238','51241','51243','51334','51357','51359','51367','51368','51369',
'51377','51378','51468','51469','51470','51477','51482','51526','51542','51567',
'51571','51572','51573','51627','51628','51636','51639','51656','51704','51705',
'51707','51709','51717','51720','51722','51730','51747','51765','51802','51810',
'51811','51814','51815','51818','51826','51827','51828','51829','51839','51855',
'51931','52101','52112','52118','52203','52313'
}
# 初始化一个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("数据处理完成!")