本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,首先依据某一列数据的特征截取我们需要的数据,随后对截取出来的数据逐行求差,并基于其他多个文件夹中同样大量的Excel表格文件,进行数据跨文件合并的具体方法。

  首先,我们来明确一下本文的具体需求。现有一个文件夹,其中有大量的Excel表格文件(在本文中我们就以.csv格式的文件为例),且每一个文件名称都表示该文件对应的数据源点的ID;如下图所示。

  其中,每一个Excel表格文件都有着如下图所示的数据格式;其中的第1列,是表示天数的时间数据,每一行数据之间的时间跨度是8天。

  我们希望实现的是,首先对于这个文件夹中的每一个文件,都截取出其中天数在2022001(也就是2022年第1天)及之后的部分;随后,对截取出来的数据的各列(除了第1列,因为第1列是表示时间的数据)加以逐行求差——例如,用2022009的数据减去2022001的数据,随后用2022017的数据减去2022009的数据,并将差值作为新的几列放在原有的几列后面;还有,我们还希望从当前文件的文件名、以及第1列的天数中,提取出一些关键信息,作为新的列放在后面(我这里是希望生产一个深度神经网络回归的训练数据,所以就需要组合各类的数据)。此外,我们还有2个文件夹,其中有着同样大量、同样文件命名规则、同样数据格式的数据,我们希望将这2个文件夹中与当前文件夹中每一个同名的文件中的同一天的数据合并。

  了解了需求,我们就可以开始代码的书写。本文用到的代码如下所示。

# -*- coding: utf-8 -*-
"""
Created on Thu May 18 11:36:41 2023 @author: fkxxgis
""" import os
import numpy as np
import pandas as pd original_path = "E:/01_Reflectivity/99_Model_Training/00_Data/02_Extract_Data/17_HANTS"
era5_path = "E:/01_Reflectivity/99_Model_Training/00_Data/03_Meteorological_Data/02_AllERA5"
history_path = "E:/01_Reflectivity/99_Model_Training/00_Data/02_Extract_Data/18_AllYearAverage_2"
output_path = "E:/01_Reflectivity/99_Model_Training/00_Data/02_Extract_Data/19_2022Data" era5_files = os.listdir(era5_path)
history_files = os.listdir(history_path) for file in os.listdir(original_path):
file_path = os.path.join(original_path, file) if file.endswith(".csv") and os.path.isfile(file_path):
point_id = file[4 : -4] df = pd.read_csv(file_path)
filter_df = df[df["DOY"] >= 2022001]
filter_df = filter_df.reset_index(drop = True)
filter_df["blue_dif"] = filter_df["blue"].diff()
filter_df["green_dif"] = filter_df["green"].diff()
filter_df["red_dif"] = filter_df["red"].diff()
filter_df["inf_dif"] = filter_df["inf"].diff()
filter_df["si1_dif"] = filter_df["si1"].diff()
filter_df["si2_dif"] = filter_df["si2"].diff()
filter_df["NDVI_dif"] = filter_df["NDVI"].diff()
filter_df["PointType"] = file[4 : 7]
filter_df["days"] = filter_df["DOY"] % 1000 for era5_file in era5_files:
if point_id in era5_file:
era5_df = pd.read_csv(os.path.join(era5_path, era5_file)) rows_num = filter_df.shape[0]
for i in range(rows_num):
day = filter_df.iloc[i, 0]
row_need_index = era5_df.index[era5_df.iloc[ : , 1] == day]
row_need = row_need_index[0]
sola_data_all = era5_df.iloc[row_need - 2 : row_need, 2]
temp_data_all = era5_df.iloc[row_need - 6 : row_need - 2, 3]
prec_data_all = era5_df.iloc[row_need - 5 : row_need - 1, 4]
soil_data_all = era5_df.iloc[row_need - 6 : row_need - 2, 5 : 7 + 1]
sola_data = np.sum(sola_data_all.values)
temp_data = np.sum(temp_data_all.values)
prec_data = np.sum(prec_data_all.values)
soil_data = np.sum(soil_data_all.values)
filter_df.loc[i, "sola"] = sola_data
filter_df.loc[i, "temp"] = temp_data
filter_df.loc[i, "prec"] = prec_data
filter_df.loc[i, "soil"] = soil_data
break for history_file in history_files:
if point_id in history_file:
history_df = pd.read_csv(os.path.join(history_path, history_file)).iloc[ : , 1 : ]
history_df.columns = ["blue_h", "green_h", "red_h", "inf_h", "si1_h", "si2_h", "ndvi_h"]
break filter_df_new = pd.concat([filter_df, history_df], axis = 1) output_file = os.path.join(output_path, file)
filter_df_new.to_csv(output_file, index = False)

  代码中首先定义了几个文件夹路径,分别是原始数据文件夹(也就是本文开头第1张图所示的文件夹)、ERA5气象数据文件夹、历史数据文件夹和输出文件夹。然后,通过 os.listdir() 函数获取了ERA5气象数据文件夹和历史数据文件夹中的所有文件名,并在后续的循环中使用。

  接下来是一个 for 循环,遍历了原始数据文件夹中的所有.csv文件,如果文件名以 .csv 结尾并且是一个合法的文件,则读取该文件。然后,根据文件名提取了点ID,并使用Pandas中的 read_csv() 函数读取了该文件的数据。接着,使用Pandas中的 loc[] 函数对数据进行了处理,包括筛选出DOY大于等于 2022001 的行,将其重置索引,并计算了反射率数据的差值。然后,将一些元数据添加到筛选后的数据中,包括点类型和天数。

  接下来是两个 for 循环,分别用于处理ERA5气象数据和历史数据。在处理ERA5气象数据时,首先找到与当前点ID匹配的ERA5气象数据文件,并使用Pandas中的 read_csv() 函数读取了该文件的数据。然后,使用 iloc[] 函数根据当前日期找到了ERA5气象数据中对应的行,并从该行及其前两行中提取了太阳辐射、温度、降水和土壤湿度数据。最后,将这些数据添加到筛选后的数据中。

  在处理历史数据时,首先找到与当前点ID匹配的历史数据文件,并使用Pandas中的 read_csv() 函数读取了该文件的数据。然后,使用 iloc[] 函数删除了第一列,并将剩余列重命名为blue_hgreen_hred_hinf_hsi1_hsi2_hndvi_h。最后,使用Pandas中的 concat() 函数将筛选后的数据和历史数据合并成一个新的DataFrame

  最后,使用Pandas中的 to_csv() 函数将新的DataFrame保存到输出文件夹中。

  运行上述代码,我们即可得到无数个组合后的Excel表格文件,其中每一个文件的列都如下图所示,已经是我们合并了各类信息之后的了。

  这样,就完成了我们神经网络训练数据集的生产过程。

  至此,大功告成。

Python批量分割Excel后逐行做差、合并文件的方法的更多相关文章

  1. 用python批量处理Excel表格,处理结果又快又好,做办公室最靓的那个仔

    使用python批量处理Excel数据     让你根据Excel上所有人的身份证号码,提取出公司员工的生日 让你每个月都将公司所有人的考勤数据整理一下 类似这样的格式化的重复操作,你还在每次都使用的 ...

  2. Python批量修改Excel中的文件内容

    import osimport xlrdfrom xlutils.copy import copydef base_dir(filename=None):    return os.path.join ...

  3. python批量更改文件名并移动到新的文件夹

    python批量更改文件名并移动到新的文件夹 前言: 1. 这里的代码以批量命名如: 路径"E:\下载\1\xxxx.mp4"."E:\下载\2\xxxx.mp4&quo ...

  4. python批量处理excel文件数据

    https://www.zhihu.com/question/39299070?sort=created 作者:水中柳影链接:https://www.zhihu.com/question/392990 ...

  5. Python的Flask框架使用Redis做数据缓存的配置方法

    flask配置redis 首先得下载flask的缓存插件Flask-Cache,使用pip下载. sudo pip install flask_cache 为应用扩展flask_cache   app ...

  6. python批量删除子文件夹中的空子文件夹

    例如A文件夹下有许多子文件夹,我需要获得的是子文件夹中的图片,但是现在子文件夹中不光有图片,还混入了空的文件夹(在使用OpenImages工具箱的时候,按照检索的方式下载的图片文件中是带有label的 ...

  7. Python学习笔记【第七篇】:文件及文件夹操作

     介绍 我们用pytthon.C#.Java等这些编程语言,想要把文件(文字.视频....)永久保存下来就必须将文件写入到硬盘中,这就需要我们应用程序去操作硬件,我们这些编程语言是无法直接操作硬件的. ...

  8. 震惊!当Python遇到Excel后,将开启你的认知虫洞

    本文主要内容:   1. Excel,你为什么如此强大 2. 软件开发也需要团队作战 3. Excel的集成方案演化 4. macOS特有的集成方案:applescript 5. Python与Exc ...

  9. Java String Integer转换 练习:编程求字符串“100”和“150”按十进制数值做差后的结果以字符串形式输出。

    package com.swift; public class String_To_Integer_Test { public static void main(String[] args) { /* ...

  10. python 作业 批量读取excel文件并合并为一张excel

    1 #!/usr/bin/env python 2 # coding: utf-8 3 4 def concat_file(a,b): 5 #如何批量读取并快速合并文件夹中的excel文件 6 imp ...

随机推荐

  1. 在宝塔上配置打包好的vue3项目

    配置文件如下 server{ listen 80; server_name gongchang.365cb.cn; index index.html index.htm default.php def ...

  2. TP5系列 | Queue消息队列

    消费信息如下ThinkPHP5 Queue消息队列 优点 1.Queue内置了 Redis,Database,Topthink ,Sync这四种驱动,本文使用Redis驱动 2.Queue消息队列适用 ...

  3. my-http-server 静态服务器源码学习实现缓存及压缩

    目录 一.准备工作及流程说明 二.配置命令行 三.设置入口文件和渲染模板 四.my-http-server源码 一.准备工作及流程说明 一看这标题,大家可能一下子没有反应过来,到底是要干什么?那么就先 ...

  4. 前缀函数及 Knuth–Morris–Pratt 算法学习笔记

    \(\text{1 引言 Preface}\) 对于形如以下的问题: 给予一个模式串 \(T\) 和主串 \(S\),在主串中寻找 \(T\). 我们称之为字符串匹配. 很显然朴素算法时间复杂度是 \ ...

  5. 解锁 SQL Server 2022的时间序列数据功能

    解锁 SQL Server 2022的时间序列数据功能 SQL Server2022在处理时间序列数据时,SQL Server 提供了一些优化和功能,比如 DATE_BUCKET 函数.窗口函数(如 ...

  6. UML各类基础知识总结

    1.UML关系 泛化(也就是我们传统意义上的继承关系) 子类继承父类,关系用extend关键字标识: 关联 可以说是一种属于关系,图中即说的是PhoneNumber类属于Master类,同时,除了一对 ...

  7. ComfyUI插件:ComfyUI Impact 节点(二)

    前言: 学习ComfyUI是一场持久战,而 ComfyUI Impact 是一个庞大的模块节点库,内置许多非常实用且强大的功能节点 ,例如检测器.细节强化器.预览桥.通配符.Hook.图片发送器.图片 ...

  8. sharding-jdbc 兼容 MybatisPlus的动态数据源

    背景:之前的项目做读写分离的时候用的 MybatisPlus的动态数据做的,很多地方使用的@DS直接指定的读库或者写库实现的业务:随着表数据量越来越大,现在打算把比较大的表进行水平拆分,准备使用 Sh ...

  9. Java--匿名类(学习笔记)

    匿名类的特点:(1) 匿名类是final类:(3) 在匿名类中可以定义实例变量和若干个实例初始化代码块和新的实例方法.Java虚拟机首先调用父类的构造方法,然后按照实例变量的和实例初始化代码块定义的先 ...

  10. pycham配置GitHub环境【一文了解window上GitHub的基本操作】

    基础用户设置[包含用户登录.密钥生成] 网络配置 外观->系统设置->https代理->检查连接 我这里测试网址是GitHub,连接成功即可后续操作[不成功别找我,我也不知道] gi ...