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 = {
'53517', '53518', '53519', '53603', '53610', '53611', '53612', '53614', '53615', '53617', '53618',
'53619', '53704', '53705', '53707', '53723', '53727', '53806', '53810', '53817', '53881', '53903',
'53910', '53914', '53916'
}
# 初始化一个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.path.join()**:
- **作用**:用于将多个路径组合成一个路径。
- **用法**:接受任意数量的参数,并将它们连接成一个路径。它会根据操作系统的不同,自动选择正确的路径分隔符。
- **示例**:`os.path.join('folder', 'subfolder', 'file.txt')` 返回 `folder\subfolder\file.txt`。
2. **os.makedirs()**:
- **作用**:用于递归创建目录。
- **用法**:接受目录路径作为参数,并创建该路径指定的目录。如果指定的目录已存在,则不会抛出错误。
- **示例**:`os.makedirs('new_folder/sub_folder', exist_ok=True)` 将创建 `new_folder` 目录,并在其中创建 `sub_folder` 目录。
3. **defaultdict**:
- **作用**:是字典的一个子类,在字典中提供了默认值。
- **用法**:创建时需传递一个可调用对象,例如 `int`、`list`、`set` 或其他函数。当访问字典中不存在的键时,会调用该可调用对象以生成默认值。
- **示例**:`data_dict = defaultdict(list)` 将创建一个默认值为列表的 defaultdict。
4. **pd.read_excel()**:
- **作用**:用于从 Excel 文件中读取数据。
- **用法**:接受 Excel 文件路径作为参数,并返回一个 DataFrame 对象,其中包含 Excel 文件中的数据。
- **示例**:`df = pd.read_excel('data.xlsx')` 将读取名为 `data.xlsx` 的 Excel 文件,并将数据存储在 DataFrame `df` 中。
5. **df.groupby()**:
- **作用**:用于按照指定列的值进行分组。
- **用法**:接受一个或多个列名作为参数,并返回一个 GroupBy 对象,可以对其进行聚合操作。
- **示例**:`grouped = df.groupby('Column')` 将按照 `Column` 列的值对 DataFrame 进行分组。
6. **pd.concat()**:
- **作用**:用于沿着指定轴将多个 DataFrame 连接在一起。
- **用法**:接受一个 DataFrame 列表作为参数,并返回连接后的 DataFrame。
- **示例**:`concatenated = pd.concat([df1, df2])` 将连接 `df1` 和 `df2` 两个 DataFrame。
7. **data.to_excel()**:
- **作用**:用于将 DataFrame 数据写入 Excel 文件。
- **用法**:接受 Excel 文件路径作为参数,并将 DataFrame 中的数据写入到指定的 Excel 文件中。
- **示例**:`data.to_excel('output.xlsx', index=False)` 将 DataFrame 中的数据写入到名为 `output.xlsx` 的 Excel 文件中,不包含索引。
这些函数在数据处理和文件操作中非常常用,它们能够方便地实现数据的读取、处理和写入,提高了编程效率和代码的可读性。
8. **df.sort_values()**:
- **作用**:用于按照指定列或多列的值对 DataFrame 进行排序。
- **用法**:接受一个或多个列名作为参数,并返回一个根据指定列值排序后的 DataFrame。
- **示例**:`sorted_df = df.sort_values(by=['Column1', 'Column2'])` 将按照 `Column1` 和 `Column2` 列的值对 DataFrame 进行排序。
9. **os.listdir()**:
- **作用**:用于返回指定目录下的所有文件和文件夹的名称列表。
- **用法**:接受目录路径作为参数,并返回一个包含目录中所有文件和文件夹名称的列表。
- **示例**:`files = os.listdir('folder')` 将返回指定目录下的所有文件和文件夹的名称列表。
10. **str.endswith()**:
- **作用**:用于检查字符串是否以指定后缀结尾。
- **用法**:接受一个字符串后缀作为参数,并返回 `True` 或 `False`。
- **示例**:`filename.endswith('.xlsx')` 将返回文件名是否以 `.xlsx` 结尾的布尔值。
11. **pd.DataFrame.astype()**:
- **作用**:用于将 DataFrame 中指定列的数据类型转换为指定类型。
- **用法**:接受一个字典或 Series 对象作为参数,其中键是列名,值是要转换的数据类型。
- **示例**:`df['Column'] = df['Column'].astype(str)` 将 `Column` 列的数据类型转换为字符串类型。
12. **pd.ExcelWriter()**:
- **作用**:用于创建一个 Excel 文件写入器对象。
- **用法**:接受 Excel 文件路径作为参数,并返回一个 ExcelWriter 对象,可以通过该对象将多个 DataFrame 数据写入同一个 Excel 文件的不同工作表。
- **示例**:`writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter')` 将创建一个将数据写入到名为 `output.xlsx` 的 Excel 文件的 ExcelWriter 对象。
这些函数都是 Python 数据处理和文件操作中常用的工具,掌握它们的用法可以提高数据处理效率,实现更多的功能。
13. **os.makedirs() 函数**:
- **作用**:用于创建目录,包括递归创建子目录。
- **用法**:接受目录路径作为参数,可以选择是否递归创建目录。
- **示例**:`os.makedirs('new_folder/sub_folder', exist_ok=True)` 将创建 `new_folder` 目录,并在其中创建 `sub_folder` 目录。如果目录已存在,则不会引发异常,通过设置 `exist_ok=True` 来实现。
14. **pd.read_excel() 函数**:
- **作用**:用于从 Excel 文件中读取数据并创建 DataFrame。
- **用法**:接受 Excel 文件路径作为参数,并返回一个 DataFrame 对象,其中包含 Excel 文件中的数据。
- **示例**:`df = pd.read_excel('data.xlsx')` 将读取名为 `data.xlsx` 的 Excel 文件,并将数据存储在 DataFrame `df` 中。
15. **df.groupby() 方法**:
- **作用**:用于对 DataFrame 进行分组操作。
- **用法**:接受一个或多个列名作为参数,并返回一个 GroupBy 对象,可以对其进行聚合操作。
- **示例**:`grouped = df.groupby('Column')` 将按照 `Column` 列的值对 DataFrame 进行分组。
16. **pd.concat() 函数**:
- **作用**:用于沿着指定轴将多个 DataFrame 连接在一起。
- **用法**:接受一个 DataFrame 列表作为参数,并返回连接后的 DataFrame。
- **示例**:`concatenated = pd.concat([df1, df2])` 将连接 `df1` 和 `df2` 两个 DataFrame。
17. **data.to_excel() 方法**:
- **作用**:用于将 DataFrame 数据写入 Excel 文件。
- **用法**:接受 Excel 文件路径作为参数,并将 DataFrame 中的数据写入到指定的 Excel 文件中。
- **示例**:`data.to_excel('output.xlsx', index=False)` 将 DataFrame 中的数据写入到名为 `output.xlsx` 的 Excel 文件中,不包含索引。
这些函数和方法是 Python 中处理数据和文件操作的重要工具,掌握它们的用法可以帮助你更有效地进行数据处理和文件操作。