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

但涉及一些数据的安全, 和指标这块也是不能透露的, 因此只能是贴上代码, 目的还是给自己以后做参考的. 代码中有个常数, 其实表示每个文件, 每行的同位置的值, 是一样的. 是发现规律了, 最开始是找近似, 去最为接近的一条, 后来写完发现, 根本不用不动. 然后, 文本数据, 就是后缀不是常用的, 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. ctfshow web入门 文件包含全部wp

    Web78 <?php if(isset($_GET['file'])){ $file = $_GET['file']; include($file); }else{ highlight_fil ...

  2. Spark1.6和2.0版本区别(一) 累加器

    1.6版本 2.0版本

  3. Ethernet协议和ARP协议分析

    实验介绍: 在信息的传输中,协议至关重要. 使用的实验环境是 kali 2017.arp协议还需要用到靶机centos7 如果是kali的其他版本可能会导致无法抓包. 一:网络分析工具(kali) S ...

  4. hexo 图片添加水印(png, jpeg, jpg, gif)

    文章同步发布:https://blog.jijian.link/2020-04-21/hexo-watermark/ 本文折腾 hexo 图片添加水印功能,大部分代码沿用: nodejs 图片添加水印 ...

  5. 启动本地node服务器报错: Access denied for user ‘root‘@‘localhost‘ (using password: YES)

    背景:今天启动node服务时直接报错,顿时一激灵,之前(几个月前哈哈)明明好好的.主要问题就是在连接数据库上,我登上mysql瞅瞅有没有问题,当要输入密码时,emmm, 很好, 忘记root密码了,于 ...

  6. golang 逃逸分析详解

    疑问 请问main调用GetUserInfo后返回的&User{...}.这个变量是分配到栈上了呢,还是分配到堆上了? package main type User struct { ID i ...

  7. Windows 提权-服务_弱服务权限

    本文通过 Google 翻译 Weak Service Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行 ...

  8. oracle的各版本的名称

    我最早接触的是oracle的版本8那个时候是8i i是internet后来是9i然后到10,就是版本10g g是grid的意思然后是11g然后12就变成了C,就是12c c是cloud的意思然后后面的 ...

  9. FireDAC开发DataSnap应用系统【3】-使用TFDJSONDatasets的CRUD功能

    类别 说明 TFDJSONDeltas 包含异动的delta的类别.客户端存放deltade对象 TFDJSONDeltasWriter 把deltas写入TFDJSONDeltas TFDJSOND ...

  10. FastAPI依赖注入作用域与生命周期控制

    title: FastAPI依赖注入作用域与生命周期控制 date: 2025/04/08 00:02:10 updated: 2025/04/08 00:02:10 author: cmdragon ...