import pandas as pd
import os
# 主目录
main_directory = r'D:\STI\SPEI_STI01\新疆'
# 遍历主目录下的所有子目录
for subdir, _, _ in os.walk(main_directory):
# 检查子目录是否为空
if len(os.listdir(subdir)) > 0:
# 找到子目录中的STI和SPEI文件
sti_files = [f for f in os.listdir(subdir) if f.startswith('STI_') and f.endswith('.xlsx')]
spei_files = [f for f in os.listdir(subdir) if f.endswith('.xlsx') and not f.startswith('STI_')]
# 检查是否找到了STI和SPEI文件
if sti_files and spei_files:
# 读取STI文件的第二列数据
sti_filename = os.path.join(subdir, sti_files[0])
sti_df = pd.read_excel(sti_filename)
sti_data = sti_df.iloc[:, 1] # 第二列数据
sti_data.name = 'STI' # 设置列名
# 读取SPEI文件的第三列数据
spei_filename = os.path.join(subdir, spei_files[0])
spei_df = pd.read_excel(spei_filename)
spei_data = spei_df.iloc[:, 1] # 第三列数据
spei_data.name = 'SPEI' # 设置列名
# 合并数据并保存到新表格
result_df = pd.concat([sti_data, spei_data], axis=1)
# 获取子目录名作为新文件名的一部分
subdir_name = os.path.basename(subdir)
result_filename = os.path.join(subdir, f'STI_SPEI_{subdir_name}.xlsx')
result_df.to_excel(result_filename, index=False)
让我们解析每个函数的含义、用法,并举例说明:
1. **`import pandas as pd`:**
- **含义:** 导入 Pandas 库并给它取别名 pd,用于数据处理和分析。
- **用法:** `pd.read_excel()` 等函数用于读取 Excel 文件,`pd.concat()` 函数用于合并数据。
- **示例:** `pd.read_excel('file.xlsx')` 用于读取名为 'file.xlsx' 的 Excel 文件。
2. **`import os`:**
- **含义:** 导入 os 模块,用于操作文件路径。
- **用法:** `os.path.join()` 函数用于拼接路径,`os.listdir()` 函数用于列出指定目录下的文件和目录。
- **示例:** `os.path.join('dir', 'file.xlsx')` 用于拼接目录名和文件名。
3. **`main_directory = r'D:\STI\SPEI_STI01\新疆'`:**
- **含义:** 定义主目录路径,即存放STI和SPEI文件的根目录。
- **用法:** 用于定义文件夹路径。
- **示例:** `main_directory = r'C:\Data'` 定义主目录为 'C:\Data'。
4. **`for subdir, _, _ in os.walk(main_directory):`:**
- **含义:** 使用 os 模块中的 walk 函数遍历主目录及其所有子目录。
- **用法:** 用于遍历目录树,获取目录路径、子目录列表和文件列表。
- **示例:** `for root, dirs, files in os.walk('dir'):` 遍历名为 'dir' 的目录。
5. **`pd.read_excel(filename)`:**
- **含义:** 读取 Excel 文件并返回 DataFrame。
- **用法:** 用于从 Excel 文件中读取数据。
- **示例:** `df = pd.read_excel('data.xlsx')` 读取名为 'data.xlsx' 的 Excel 文件。
6. **`pd.concat([df1, df2], axis=1)`:**
- **含义:** 沿着指定轴连接多个 DataFrame。
- **用法:** 用于沿着行或列方向合并数据。
- **示例:** `result_df = pd.concat([df1, df2], axis=1)` 合并两个 DataFrame。
7. **`os.path.basename(subdir)`:**
- **含义:** 返回路径的最后一个元素,即目录的基本名称。
- **用法:** 用于获取路径的最后一部分,通常用于获取目录名。
- **示例:** `basename = os.path.basename('dir/subdir')` 返回 'subdir'。
8. **`result_df.to_excel(filename, index=False)`:**
- **含义:** 将 DataFrame 写入 Excel 文件。
- **用法:** 用于将数据保存为 Excel 文件,可以指定是否包含行索引。
- **示例:** `result_df.to_excel('output.xlsx', index=False)` 将数据保存为 'output.xlsx' 文件,不包含行索引。
这些是代码中使用的函数的含义、用法和示例。通过理解这些函数,你可以更好地理解代码的功能和执行流程。
继续解析代码中使用的函数:
9. **`if len(os.listdir(subdir)) > 0:`:**
- **含义:** 检查目录是否为空,即是否包含文件或子目录。
- **用法:** 用于检查目录中是否存在文件或子目录。
- **示例:** `if len(os.listdir('dir')) > 0:` 检查 'dir' 目录是否为空。
10. **`[f for f in os.listdir(subdir) if f.startswith('STI_') and f.endswith('.xlsx')]`:**
- **含义:** 列出目录中以 'STI_' 开头且以 '.xlsx' 结尾的文件。
- **用法:** 用于筛选出满足特定条件的文件列表。
- **示例:** `[f for f in os.listdir('dir') if f.endswith('.txt')]` 列出目录中所有以 '.txt' 结尾的文件。
11. **`[f for f in os.listdir(subdir) if f.endswith('.xlsx') and not f.startswith('STI_')]`:**
- **含义:** 列出目录中以 '.xlsx' 结尾但不以 'STI_' 开头的文件。
- **用法:** 用于筛选出满足特定条件的文件列表。
- **示例:** `[f for f in os.listdir('dir') if f.startswith('SPEI_')]` 列出目录中所有以 'SPEI_' 开头的文件。
12. **`sti_df.iloc[:, 1]` 和 `spei_df.iloc[:, 1]`:**
- **含义:** 获取 DataFrame 中的第二列数据。
- **用法:** 用于选择 DataFrame 中的特定列。
- **示例:** `df.iloc[:, 1]` 获取 DataFrame 中的第二列数据。
13. **`result_df.to_excel(result_filename, index=False)`:**
- **含义:** 将 DataFrame 写入 Excel 文件,指定文件名。
- **用法:** 用于将数据保存为 Excel 文件,并指定文件名。
- **示例:** `result_df.to_excel('output.xlsx', index=False)` 将数据保存为 'output.xlsx' 文件,不包含行索引。
这些是代码中使用的其他函数的含义、用法和示例。理解了这些函数的作用,你可以更加深入地理解代码的功能和执行逻辑。
14. **`os.path.exists(source_file)`:**
- **含义:** 检查文件或目录是否存在。
- **用法:** 用于检查指定的文件或目录是否存在。
- **示例:**
```python
source_file = r'D:\STI\SPEI_STI01\新疆\STI_2022.xlsx'
if os.path.exists(source_file):
print("文件存在")
```
15. **`shutil.move(source_file, target_folder)`:**
- **含义:** 移动文件或目录到目标位置。
- **用法:** 用于将指定的文件或目录移动到目标文件夹中。
- **示例:**
```python
import shutil
source_file = r'D:\STI\SPEI_STI01\新疆\STI_2022.xlsx'
target_folder = r'D:\STI\SPEI_STI01\新疆\青海'
shutil.move(source_file, target_folder)
```
这些是代码中使用的其他函数的含义、用法和示例。通过理解这些函数,你可以更加全面地了解代码的功能和执行流程。
16. **`os.path.join(subdir, f'STI_SPEI_{subdir_name}.xlsx')`:**
- **含义:** 使用目录路径和文件名拼接出完整的文件路径。
- **用法:** 用于构建输出文件的完整路径。
- **示例:**
```python
subdir = r'D:\STI\SPEI_STI01\新疆\2022'
subdir_name = '2022'
output_file = os.path.join(subdir, f'STI_SPEI_{subdir_name}.xlsx')
```
17. **`result_df.to_excel(output_file, index=False)`:**
- **含义:** 将 DataFrame 写入 Excel 文件,并指定文件路径,不包括索引列。
- **用法:** 用于将数据保存为 Excel 文件。
- **示例:**
```python
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
output_file = 'output.xlsx'
df.to_excel(output_file, index=False)
```
这些是代码中使用的其他函数的含义、用法和示例。理解了这些函数,你就能更清晰地理解代码的功能和流程。
18. **`pd.concat([sti_data, spei_data], axis=1)`:**
- **含义:** 沿指定轴将两个 DataFrame 连接起来。
- **用法:** 用于将两个 DataFrame 沿列方向连接起来,可以指定沿行或列进行连接。
- **示例:**
```python
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})
result = pd.concat([df1, df2], axis=1)
```
19. **`result_df.to_excel(result_filename, index=False)`:**
- **含义:** 将 DataFrame 中的数据写入 Excel 文件,不包括行索引。
- **用法:** 用于将 DataFrame 中的数据保存为 Excel 文件。
- **示例:**
```python
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
df = pd.DataFrame(data)
df.to_excel('output.xlsx', index=False)
```
这些是代码中使用的其他函数的含义、用法和示例。通过理解这些函数,你就能更好地掌握代码的功能和执行过程。