重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
python很多库支持了对nc格式文件的读取,比如NetCDF4,PyNio(PyNio和PyNgl可以看做是NCL的Python版本)以及Xarray等等。
创新互联建站服务项目包括通道网站建设、通道网站制作、通道网页制作以及通道网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,通道网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到通道省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
我最初使用PyNio,但是由于NCL到Python的移植并不完全,导致目前远不如直接使用NCL方便,而在接触Xarray库后,发现其功能强大远超NCL(也可能是我NCL太菜的原因)。
安装同其它库一致:
我这里以一套中国逐日最高温度格点资料(CN05.1)为例,其水平精度为0.5°X0.5°。
可以看到,文件的坐标有时间, 经度,纬度,变量有日最高温
我们将最高温数据取出
这与Linux系统中的ncl_filedump指令看到的信息是类似的
Xarray在读取坐标信息时,自动将时间坐标读取为了datetime64 格式,这对我们挑选目的时间十分方便。Xarray通常与pandas配合使用。
比如我们想选取1979.06.01-1979.06.20时期数据,我们只需
再比如我们想选取夏季数据时,只需
更多的时间操作同python的datetime函数类似。
当我们想选取特定经纬度范围(高度)的数据时,.loc[]函数同样可以解决。
在这里,我选取了40°N-55°N,115°E-135°E范围的数据
甚至,我们还可以套娃,同时叠加时间和范围的选取
这足够满足常用到的数据索引要求。
对于这类简单排列的.txt文件,可以通过np.load读取,用pandas的.read_csv更为方便
读取txt的同时,对每列赋予了一个列名,通过data.a可以直接按列名调用相应数据。
对于较复杂的.txt文件,仍可通过该函数读取
skiprows=5跳过了前5行的文件头,sep='\s+'定义了数据间隔为空格,这里用的是正则表达。
pd.read_csv函数有很多的参数,可以处理各种复杂情况下的文本文件读取。
grib文件可通过pygrib库读取
import pygrib
f = pygrib.open('xxx.grb')
经常 我们在处理小数据集是 不想用大刀,逮住了excel 就想 一直拖拖拉拉就把数据先处理一下,实在处理费力,再从 python numpy pandas 处理一通。
常见的 在处理五要素的时候,姓名基本没啥要处理的,
1.身份证号 手机号 银行卡号 经常是 显示为 E+17 或者 前面带有 ``` 字符
2.申请日期经常是各种格式,有时候一不小心就变成乱码的数字 后者####。
3.如果 excel 有外部链接存在,即使忽略,但是 在修改的时候还是非常糟心,要等很久,而且经常无法保存,excel就崩溃了
4.还有就是 本身就是文本,但是使用 TEXT LEFT RIGHT MID IF 没有任何效果
5.excel 读取 含有中文的数据显示乱码
6.多条件的替换问题,if嵌套。
7.批量 替换 匹配
8.空值问题
9.筛选问题
10.脚本读取文件
其实就是以上的这些小情况,经常浪费大量时间,急需一招狠制敌
接着说 1.
因为很多时候 excel会把一些类数值的身份证号和手机号当做数字,这个其实是数据源在使用python处理的时候没有来得及保存 对应列的 数据类型。
在出现 E+17,我们首先想到的是修改 单元格格式,比如保存为文本,假如正常那简直是万幸,如果不可以,可能会发现 修改后的数据末尾都变成了3个零。
另外一个终极方法
这里,有一个简单的操作方法:选择数据源——右键设置单元格格式——自定义——选择0,按确定——结果出来了。结果很明显,是我们需要的效果,而且快捷,方便。
另外就是使用python pandas读取 ,设置 dtype=np.str
对于 身份证或者手机号 银行卡号 数据首位出现 【`】字符的,可以使用 RIGHT MID 函数做数据的截取
对于数据出现 ###,一般修改单元格格式 ,或者 拉长单元格,或者 python读取一下就可以处理
最后就是说2了。日期
其实这个日期,就是格式太特么的多和复杂不固定。我们现在 使用的是 类似 2018-4-17 这种格式,所以只要不符合这种格式的,我们都会需要做一些转化,
最简单的 就是使用 TEXT 函数 ,一般这样用 =TEXT(E2,"yyyy-mm-dd")
基本就可以转化过来。
如果以上不起作用 参考 处理 4 的方法 不断尝试 ,最后确认函数真的不会起作用为止。
之后如果 不小心 变成一段数字了,修改单元格格式,转回日期一般是有效的。
如果日期 函数不起效果,我们使用截取 拼接的方式 使用 RIGHT LEFT MID
CONCATENATE() 这些函数 一般也可以胜任
如果 还是不行也可以 使用 YEAR() DATE() EXCEL 本身的日期处理函数
另外就是修改单元格格式 ,尝试一下各种日期格式是否可以满足要求
另外的杀手锏就是 python pandas 和numpy都有 时间处理的函数
可以参考
推荐阅读
下面分别说一下 。先说 3
这种带外部链接存在的,曾经尝试过全文copy 新的 sheet 甚至是新的excel文件,但是还是崩溃,所以还是使用python 的pandas 。在使用pandas 读取后,根据列名 筛选后,另存为新的excel 文件或者csv文件 ,这样一般不会有 问题,顺利解决,一般文件也变小。
再说 4.
对于 使用函数 并不起作用的列,一般 情况 可能单元格 格式不是文本,可以先修改单元格格式转为文本后再尝试,
假如还是失败,则 复制该列,选择有选择粘贴 只要值,在进行函数尝试 ,
如果还是失败,则 新建一个sheet ,在复制 有选择粘贴 只要值,再进行函数尝试,
如果还不行,则新建 excel 再复制有选择的粘贴 只要值。在进行函数尝试,
假如还不可以 则使用python pandas 读取,并设置 dtype=numpy.str,
如果还是不可以,数量少自己手动改,数量多 则请求数据源从新整。
另外 还可以尝试 另存为比如csv 格式 或者使用python 另存为 其他新文件或者csv,再尝试读取 函数修改
之后说5
Excel 读取汉字乱码 ,sublime 也乱码
可以使用 python pandas 读取 ,
如果 utf-8 不行 ,就转 gbk
另外就是 excel 读取没有乱码 ,但是 在 Terminal 终端 读取 中文又乱码了,怎么办 ,当然 好办,excel 保存为csv 或者txt ,使用sublime 或者notpad ++ 打开 ,选择 标题栏 【FILE] 下拉框里 选择【Save with Encoding 】,选择 第一个 【UTF-8] 或者 【UTF-8 NO BOM],则再次在终端命令行读取 ,中文可以正常显示。
说说 6 多条件 替换
一定要 主要了 如果 if 的condition 是 比较数值,这个不用使用单引号 双引号,
如果condition是 文字 匹配的话,切记 一定要使用英文下的双引号,否则 报错,英文下的单引号也会报错。if 嵌套可以很多个if 像套娃一样套着,另外 if 还可以和 AND OR 一起配合着使用
比如
还要说7
对于 批量替换 匹配的,这个真是excel 函数最大的魔力。设置好函数后,回车显示好效果,没问题的就直接双击 黑实心十字 【+】,然后这个函数就会作用到整列,需要注意的就是 如果该列有空值的话,经常会阻隔函数的继续执行 ,需要我们 大概手动在拖拉一下,再双击 之后的。
8空值的处理
由于我们经常是胡子嘴巴一起抓,excel 和python 经常会遇到处理空值的问题,关键空值还不太统一 ,有 "" " " "\t" nan null None ,几种,需要我们不断归一为一种,有时候 excel 没有 python pandas 处理默认就变成 NAN,如果不小心保存了,在新打开 excel文件就都有 NAN 或者nan ,需要我们处理
出现 这个
ValueError: empty string for float() data = data.fillna('')
data["field"].isnull
data.dropna()
Pandas 在读取的时候 加一个 参数 dtype=np.object
9.另外 excel 本身有很多很简单 也超级好用的工具箱
最好用的就是筛选 ,可以比较数值 ,是否包含字符,长度 来做筛选,
另外 比较好用的是 vlookup 这个函数 ,其实比较高大上,用好了 非常节省时间
另外是 比如删除 重复项 , 合并计算 模拟分析 排序,
【公式】 【数据】 是 留给数据分析师最好的武器
10.比如我们的小数据经常还是需要存储到hive 库中,大部分我们会写一个脚本
来etl 并执行 hive -e hql ,然后使之可以批量 存储。有时候 读取 txt文件 会出错 ,比如 列 粘连了, 其实 可以把excel 另存为 csv 格式 ,这样可以避免 列粘连。
大部分我们的脚本都会ftp上传到服务器上,有时候很大,好不容易上传了, 发现文件还是有点错误 ,比如 列名header 应该去除没有去除,比如数据末尾多了好多空行 ,比如 需要批量replace ,需要你 可以 熟练使用 vim 或者 emacs ,最好 安装 python3.6 ptpython pandas numpy sklearn 等常用的包
在实际处理数据时,因系统内存有限,我们不可能一次把所有数据都导出进行操作,所以需要批量导出依次操作。为了加快运行,我们会采用多线程的方法进行数据处理, 以下为我总结的多线程批量处理数据的模板:
主要分为三大部分:
共分4部分对多线程的内容进行总结。
先为大家介绍线程的相关概念:
在飞车程序中,如果没有多线程,我们就不能一边听歌一边玩飞车,听歌与玩 游戏 不能并行;在使用多线程后,我们就可以在玩 游戏 的同时听背景音乐。在这个例子中启动飞车程序就是一个进程,玩 游戏 和听音乐是两个线程。
Python 提供了 threading 模块来实现多线程:
因为新建线程系统需要分配资源、终止线程系统需要回收资源,所以如果可以重用线程,则可以减去新建/终止的开销以提升性能。同时,使用线程池的语法比自己新建线程执行线程更加简洁。
Python 为我们提供了 ThreadPoolExecutor 来实现线程池,此线程池默认子线程守护。它的适应场景为突发性大量请求或需要大量线程完成任务,但实际任务处理时间较短。
其中 max_workers 为线程池中的线程个数,常用的遍历方法有 map 和 submit+as_completed 。根据业务场景的不同,若我们需要输出结果按遍历顺序返回,我们就用 map 方法,若想谁先完成就返回谁,我们就用 submit+as_complete 方法。
我们把一个时间段内只允许一个线程使用的资源称为临界资源,对临界资源的访问,必须互斥的进行。互斥,也称间接制约关系。线程互斥指当一个线程访问某临界资源时,另一个想要访问该临界资源的线程必须等待。当前访问临界资源的线程访问结束,释放该资源之后,另一个线程才能去访问临界资源。锁的功能就是实现线程互斥。
我把线程互斥比作厕所包间上大号的过程,因为包间里只有一个坑,所以只允许一个人进行大号。当第一个人要上厕所时,会将门上上锁,这时如果第二个人也想大号,那就必须等第一个人上完,将锁解开后才能进行,在这期间第二个人就只能在门外等着。这个过程与代码中使用锁的原理如出一辙,这里的坑就是临界资源。 Python 的 threading 模块引入了锁。 threading 模块提供了 Lock 类,它有如下方法加锁和释放锁:
我们会发现这个程序只会打印“第一道锁”,而且程序既没有终止,也没有继续运行。这是因为 Lock 锁在同一线程内第一次加锁之后还没有释放时,就进行了第二次 acquire 请求,导致无法执行 release ,所以锁永远无法释放,这就是死锁。如果我们使用 RLock 就能正常运行,不会发生死锁的状态。
在主线程中定义 Lock 锁,然后上锁,再创建一个子 线程t 运行 main 函数释放锁,结果正常输出,说明主线程上的锁,可由子线程解锁。
如果把上面的锁改为 RLock 则报错。在实际中设计程序时,我们会将每个功能分别封装成一个函数,每个函数中都可能会有临界区域,所以就需要用到 RLock 。
一句话总结就是 Lock 不能套娃, RLock 可以套娃; Lock 可以由其他线程中的锁进行操作, RLock 只能由本线程进行操作。
如果是函数的“叠置”,即一个函数里“叠置”着另一个函数,就是复合函数。
多个函数的复合就像“俄罗斯套娃”。
如,复合函数y=ln(x^2),是y=lnu,u=x^2的复合函数;
y=ln^2
x,
是y=u^2,u=ln的复合函数;
y=lnlnlnx,是y=lnu,u=lnv,v=lnx的复合函数。
在 Python 中推导式是一种非常 Pythonic 的知识,本篇博客将为你详细解答列表推导式与字典推导式相关的技术知识。
列表推导式可以利用列表,元组,字典,集合等数据类型,快速的生成一个特定需要的列表。
语法格式如下:
if 条件表达式 非必选,学完列表推导式之后,你可以发现它就是 for 循环的一个变种语句,例如咱们现有一个需求是将一个列表中的所有元素都变成原值的 2 倍。
for 循环写法
列表推导式写法
是不是对比看就是将 for 循环语句做了变形之后,增加了一个 [] ,不过需要注意的是,列表推导式最终会将得到的各个结果组成一个新的列表。
再看一下列表推导式语法构成 nn_list = [i*2 for i in my_list] , for 关键字后面就是一个普通的循环,前面的表达式 i*2 其中的 i 就是 for 循环中的变量,也就是说表达式可以用后面 for 循环迭代产生的变量,理解这个内容列表推导式就已经掌握 9 成内容了,剩下的是熟练度的问题。
在将 if 语句包含进代码中,运行之后,你也能掌握基本技巧, if 语句是一个判断,其中 i 也是前面循环产生的迭代变量。
这些都是一般技能,列表推导式能支持两层 for 循环,例如下述代码:
当然如果你想 加密(谁都看不懂你的代码) 你的代码,你可以无限套娃下去,列表推导式并没有限制循环层数,多层循环就是一层一层的嵌套,你可以展开一个三层的列表推导式,就都明白了
当然在多层列表推导式里面,依旧支持 if 语句 ,并且 if 后面可以用前面所有迭代产生的变量,不过不建议超过 2 成,超过之后会大幅度降低你代码的可阅读性。
当然如果你希望你代码更加难读,下面的写法都是正确的。
现在你已经对列表推导式有比较直观的概念了,列表推导式对应的英文是 list comprehension ,有的地方写作列表解析式,基于它最后的结果,它是一种创建列表的语法,并且是很简洁的语法。
有了两种不同的写法,那咱们必须要对比一下效率,经测试小数据范围影响不大,当循环次数到千万级时候,出现了一些差异。
运行结果:
在 Python3 中列表推导式具备局部作用域,表达式内部的变量和赋值只在局部起作用,表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到它们。所以其不会有变量泄漏的问题。例如下述代码:
列表推导式还支持嵌套
参考代码如下,只有想不到,没有做不到的。
有了列表推导式的概念,字典推导式学起来就非常简单了,语法格式如下:
直接看案例即可
得到的结果如下:
此时需要注意的是字典中不能出现同名的 key,第二次出现就把第一个值覆盖掉了,所以得到的 value 都是 1。
最常见的哪里还是下述的代码,遍历一个具有键值关系的可迭代对象。
其实你应该能猜到,在 Python 中是具备这两种推导式的,而且语法相信你已经掌握了。不过语法虽然差不多,但是元组推导式运行结果却不同,具体如下。
运行之后产生的结果:
使用元组推导式生成的结果并不是一个元组,而是一个生成器对象,需要特别注意下,这种写法在有的地方会把它叫做生成器语法,不叫做元组推导式。
集合推导式也有一个需要注意的地方,先看代码:
因为集合是无序且不重复的,所以会自动去掉重复的元素,并且每次运行显示的顺序不一样,使用的时候很容易晕掉。
这篇博客,我们学习了列表和字典推导式,掌握并熟练的应用二者之后,你 Python 技能又向前进了一步。