新疆气象站降水数据提取

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("数据处理完成!")
 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

___Y1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值