就是一个批量读取文件, 然后计算指标的过程. 难度到是没啥, 只是想记录一把, 毕竟这类的需求, 其实还是蛮多的.

但涉及一些数据的安全, 和指标这块也是不能透露的, 因此只能是贴上代码, 目的还是给自己以后做参考的. 代码中有个常数, 其实表示每个文件, 每行的同位置的值, 是一样的. 是发现规律了, 最开始是找近似, 去最为接近的一条, 后来写完发现, 根本不用不动. 然后, 文本数据, 就是后缀不是常用的, Excel, Csv.. 这种, 给我有个 xx.sed 从未见过的这类. 还好我基本功可以, 毕竟当年抄过书本, read_table 这类的骚操作, 就恰好满足需求了.

因为涉及的数据不能公开, 业务这块也不能谈及, 指标计算比较多和杂. 总之是给我自己看的, 并未作为分享的.

from os import listdir
import pandas as pd
from math import log10
import time # 发现数据规律, 每个文件的第一列值 Wvl 都是固定的, 直接取即可
# 每个指标值行索引(Wvl)可以先全部找出来
R990 = 990.4
R720 = 719.5
R860 = 860.2
R790 = 789.7
R670 = 669.4
R730 = 730.2
R525 = 525.2
R750 = 749.9
R705 = 704.8
R445 = 444.5
R550 = 550.1
R870 = 869.5
R680 = 680.3
R810 = 809.7
R800 = 799.7
R700 = 699.4
R840 = 840.1
R1510 = 1511.8
R1680 = 1681.2 start = time.time() ret = [] # 结果 my_dir = './光谱数据集/'
file_list = listdir(my_dir)
for cur_file in file_list:
print("正在处理:", cur_file)
df = None
try:
df = pd.read_table(my_dir + cur_file, skiprows=26)
# df['nb'] = df['Raw Counts (Ref.)'] - df['Raw Counts (Target)']
df['nb'] = round(df['Reflect. %'] / 100, 2)
df = df.set_index('Wvl')['nb']
except Exception as e:
print("出错啦, 大兄弟!", e) # 计算着一大坨数据指标
cur_lst = []
# 被文件名作为 第一个数据
cur_lst.append(cur_file)
# RSI
rsi = df.loc[R990] / df.loc[R720]
cur_lst.append(rsi) # NDSI
ndsi = (df.loc[R860] - df.loc[R720]) / (df.loc[R860] + df.loc[R720])
cur_lst.append(ndsi) # FD_NDVI
fdndvi = (df.loc[R730] - df.loc[R525]) / (df.loc[R730] + df.loc[R525])
cur_lst.append(fdndvi)
# RENDVI
cur_lst.append((df.loc[R750] - df.loc[R705]) / (df.loc[R750] + df.loc[R705]))
# mNd705
cur_lst.append((df.loc[R750] - df.loc[R705]) / (df.loc[R750] + 2 * df.loc[R445]))
# GNDVI
cur_lst.append((df.loc[R790] - df.loc[R550]) / (df.loc[R790] + df.loc[R550]))
# SAVI
cur_lst.append(1.5 * (df.loc[R870] - df.loc[R680]) / (df.loc[R870] + df.loc[R680] + 0.16))
# OSIVI
cur_lst.append(1.16 * (df.loc[R810] - df.loc[R680]) / (df.loc[R810] - df.loc[R680] + 0.16))
# MSAVI
cur_lst.append(
2 * (df.loc[R800] + 1 - ((2 * df.loc[R800] + 1) * 2 - 8 * (df.loc[R800] - df.loc[R670])) * 0.5)
)
# DCNA
cur_lst.append(
(df.loc[R720] - df.loc[R700]) / (df.loc[R700] - df.loc[R670]) / (df.loc[R700] - df.loc[R670] + 0.03)
)
# CIgreen
cur_lst.append(((df.loc[R840] - df.loc[R870]) / df.loc[R550]) - 1)
# NINI
try:
cur_lst.append(
(log10(1 / df.loc[R1510]) - log10(1 / df.loc[R1680])) / (log10(1 / df.loc[R1510]) + log10(1 / df.loc[R1680]))
)
except:
print(cur_file, "log 计算有问题")
cur_lst.append('lg计算失败')
# TVI
cur_lst.append(
0.5 * (120 * (df.loc[R750] - df.loc[R550]) - 200 * (df.loc[R670] - df.loc[R550]))
)
# DSI
cur_lst.append(df.loc[R800] - df.loc[R680]) # 将当前结果添加到 ret 中
ret.append(cur_lst) # 最后将 [[],[]...] 再存为 DataFrame
col = ['数据文件名', 'RSI', 'NDSI', 'FD_NDVI', 'RENDVI', 'mNd705', 'GNDVI', 'SAVI',
'OSIVI', 'MSAVI', 'DCNA', 'CIgreen', 'NINI', 'TVI','DSI'] data = pd.DataFrame(ret,
columns=col)
print()
print("*"*50)
print("正在存储到, 表格...") data.to_excel("D:/光谱数据.xlsx", index=False) end = time.time()
print(f"处理完毕! 共处理 {len(file_list)} 个文件, 总共用时 {round(end - start, 2)} 秒")
print("*"*50)

其实蛮简单的一个脚本, 循环读取文件夹的数据, 然后来弄即可. 发现现在这换了 台式电脑, 果然很稳, 同时 读取 文本数据, 远比 Excel 文件, 效率高了 近 10倍.

正在处理: 20190930_00128.sed
正在处理: 20190930_00129.sed
正在处理: 20190930_00130.sed
正在处理: 20190930_00131.sed
正在处理: 20190930_00132.sed
正在处理: 20190930_00133.sed
正在处理: 20190930_00134.sed
正在处理: 20190930_00135.sed
正在处理: 20190930_00136.sed
正在处理: 20190930_00137.sed
正在处理: 20190930_00138.sed
正在处理: 20190930_00139.sed
正在处理: 20190930_00140.sed
正在处理: 20190930_00141.sed
正在处理: 20190930_00142.sed
正在处理: 20190930_00143.sed
正在处理: 20190930_00144.sed
正在处理: 20190930_00145.sed
正在处理: 20190930_00146.sed
正在处理: 20190930_00147.sed
...... **************************************************
正在存储到, 表格...
处理完毕! 共处理 1447 个文件, 总共用时 5.58 秒
**************************************************
[Finished in 6.1s]
  • 经常谈什么批量处理文件, 其实就是, 结构化的, 对单个文件, 逻辑写好, 然后循环处理 n 多个文件.
  • 对指标计算, 设计好号数据结构, 列表, 字典这些, 最好是用 生成器 yield 来弄, 最后再 list 出来, 提高性能
  • 3年多了, 真实觉得 Pandas 是真的好用哇, 尤其是处理方面, 主要是现在很多逻辑, 是通过 sql 这样产生对比.

Pandas 批量处理文本表的更多相关文章

  1. 按键精灵如何批量复制文本,再往excel里面一次性粘贴?

    原帖地址 http://zhidao.baidu.com/link?url=M2A9E1JF7wAzjtxMQG9uiW_PvP39HVlfwn6zDMzk9m6U05JA37SrgDcrVXg_c9 ...

  2. 【转载】使用Pandas创建数据透视表

    使用Pandas创建数据透视表 本文转载自:蓝鲸的网站分析笔记 原文链接:使用Pandas创建数据透视表 目录 pandas.pivot_table() 创建简单的数据透视表 增加一个行维度(inde ...

  3. Mac下用命令行直接批量转换文本编码到UTF8

    由于近期在Mac下写Android程序,下载的一些Demo由于编码问题源码里的汉字出现乱码,文件比较多,所以想批量解决下文件的编码问题. Mac下有以下两种方式可以解决: A. 文件名的编码:Mac的 ...

  4. 使用一个T-SQL语句批量查询数据表占用空间及其行数

    原文:使用一个T-SQL语句批量查询数据表占用空间及其行数 要找到数据库中数据表占用的空间和存在的行数.可以使用sp_spaceused搭配数据表的名称.就可以产生该表耗用的空间和现有行数. 如: U ...

  5. R实战 第七篇:绘图文本表

    文本表是显示数据的重要图形,一个文本表按照区域划分为:列标题,行标题,数据区,美学特征有:前景样式.背景央视.字体.网格线等. 一,使用ggtexttable绘图文本表 载入ggpubr包,可以使用g ...

  6. Sql Server利用游标批量清空数据表

    先吐槽一下,由于公司要为新客户部署一个全新的系统,然而公司并没有空库,所以只能把正在线上运行的数据库给备份,然后清空相关数据 下面分享一下我在做清空数据库时写的一个批量清空数据表的方法 思路:查询出该 ...

  7. Python3 批量替换文本内容

    Python3 批量替换文本内容 示例: # coding:utf8 import os; def reset(): i = 0 path = r"H:\asDemo\workdemo\aw ...

  8. Shell 脚本批量创建数据库表

    使用 Shell 脚本批量创建数据表 系统:Centos6.5 64位 MySQL版本:5.1.73 比如下面这个脚本: #!/bin/bash #批量新建数据表 for y in {0..199}; ...

  9. SAP查询TABLE对应的文本表

    SAP 取数时,通常配置项,需要取对应的文本描述,一般在配置表后加个T,就可以找到描述对应的表名. 但有时也有不符合这个规则的,例如生产订单类型数据表 T003O. 表名加T后并不存T003OT. 这 ...

  10. 基于CentOS的MySQL学习补充三--使用Shell批量创建数据库表

    本文出处:http://blog.csdn.net/u012377333/article/details/47006087 接上篇介绍<基于CentOS的Mysql学习补充二--使用Shell创 ...

随机推荐

  1. CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比

    CSnakes 是一个用于在.NET项目中嵌入Python代码的工具,由.NET源生成器和运行时组成,能够实现高效的跨语言调用,Github:https://github.com/tonybalone ...

  2. 深入解析:Jupyter Notebook 中魔法命令的使用技巧与应用

    Jupyter Notebook 中的魔法命令为用户提供了诸多便利功能.魔法命令主要分为行魔法(Line magic)和单元魔法(Cell magic),行魔法前缀为"%",单元魔 ...

  3. Linux - 配置IP&主机名的快捷操作

    nmtui 执行以下命令可以进入一个可视化界面,进行IP的可视化配置.以及网络服务的重启(注意,这个重启是停止然后启动, 如果使用xshell进行操作会失去ssh连接,直连服务器时可这直接操作).主机 ...

  4. Git Pull Failed:You have not concluded your merge.Exiting because of unfinished merge

    前言 在拉取远程代码时,出现 Git Pull Failed:You have not concluded your merge.Exiting because of unfinished merge ...

  5. php 过滤掉emoji表情

    <?php function filter_emoji($str) { $str = preg_replace_callback( //执行一个正则表达式搜索并且使用一个回调进行替换 '/./u ...

  6. MySQL配置主从复制教程(MySQL8)

    原理: 数据库在进行DDL和DML语句操作时,会被记录到binlog的日志文件里,而读取这里面的日志就可以知道数据库进行过哪些DDL和DML操作,这是主数据库的日志,从数据库经过相关配置可以实时获取到 ...

  7. windows Oracle 11g安装图解教程

    安装以win7/10 64位系统为例1.将win64_11gR2_database_1of2和win64_11gR2_database_2of2解压到同个文件夹下合并(可以直接左键框住右键点击一起解压 ...

  8. post数据到第三方,中文乱码

    1.项目中发现 测试环境 推送正文,数据正常 2.生产到腾讯云之后,中文推送过去乱码,但是post 接口的 时候,指定了 编码格式. 3.后查看日志,发现日志中记录的中文就是乱码 4.排查cs代码文件 ...

  9. MySQL-事务相关知识

    事务ACID的理解 引入事务的主要目的: 保证数据库从一个一致性状态切换为另一种一致性状态 所有修改要么都保存,要么都不保存 A 原子性 原子性关注单个事务的整体性,需要保证事务中的全部操作是一个单元 ...

  10. 【软件】Ubuntu下QT的安装和使用

    [软件]Ubuntu下QT的安装和使用 零.前言 QT是应用得比较广泛的程序框架,是因为其跨平台特性比较好,且用C/C++作为开发语言,性能也比较好,故本文介绍如何安装和使用QT,用的版本是QT 6. ...