作者Hsins (迅雷不及掩耳盗铃)
看板Python
标题Re: [问题] pandas.to_csv 字串型态的数字
时间Wed Dec 25 12:23:21 2019
※ 引述《nepholi (我不是炮哥)》之铭言:
: Hi all,
: 小弟刚接触Py没多久
: 经历只有用google大神边查边学基本语法
: 然後只拚出一套暴力型爬虫
: 所以可能有些东西不知道怎麽查或找错方向再请各位指教
: 这次要处理一笔资料是excel档要转成csv给後续一支正常运作中的C++读取
: 其中excel的内容为 (以下为虚构)
: 部门 | 卡号 | 名字 | 时间 |
: ABC | 00010 | John | 2019/12/25 08:00:01 |
: ABC | 00011 | Tom | 2019/12/25 08:02:55 |
: ..以此类推
: 用最直接的写法
: df = pd.read_excel('test.xlsx', usecols="A:D", dtype={'卡号':str})
: 可以成功读进我想要的资料及型态
: 1.卡号为str (为了保留完整五位数)
: 2.日期为datatime
: 然後
: df.to_csv('hello.csv', index=None, header=True, encoding='utf-8-sig',
: quoting=csv.QUOTE_NONNUMERIC)
: 这句跑完之後产出的csv其中卡号跟日期栏位却不是我想要的5位数及显示秒数
: 而是
: 部门 | 卡号 | 名字 | 时间 |
: ABC | 10 | John | 2019/12/25 08:00 |
: ABC | 11 | Tom | 2019/12/25 08:02 |
: 我有想过是不是csv的储存格格式造成
: 日期的部分证实的确是
: 但卡号的部分被预设为"通用格式"导致我的卡号被去掉了前置0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
据我所知,如果你在使用 pandas 读入档案的时候已经有使用 dtype,
或者在後续操作 dataframe 时,有透过 astype 将资料表内容转为字串格式的话。
那麽在最後使用 to_csv() 转换成 csv 格式的
纯文字档是不会格式跑掉的。
由於你提到了「通用格式」,那麽最有可能造成被截去前方零位的原因,
是使用了 Excel, Numbers 或是 LibreOffice 这类试算表软体去打开 csv 档
如果你没有特别规定读入时要进行的格式操作,
这些软体通常会自作聪明地替你处理。
---
关於 csv 档,我们可以看一下 Wiki 上面的说明:
逗号分隔值 (CSV, Comma-Separated Values),其档案以
纯文字形式储存表格资
料(数字和文字)。纯文字意味着该档案是一个字元序列,不含必须像二进位数字
那样被解读的资料。
因为通常可以用表格形式表现,所以可以用试算表软体打开,但是本质是纯文字
。建议使用纯文字的编辑器,比如:记事本、notepad++、Sublime Text 或者是
VS Code 去开,看看这些数值是不是带有 leading zero,如果有的话就不用管
他了,你转换的档案是正确的,只是试算表自己自作聪明而已,对於後续用 C++
操作是不会有影响的。
至於日期的部份,你也可以同样在读入时存成字串就不会有这个问题了。
: 不晓得有没有办法可以在python的code里面去设定这个呢
: 我找了pandas的官网说明to_csv但无斩获
: 不知道是不是我误会或漏看了..
: 感谢XD
: P.S. 因为C++里面读取卡号後并没有预设要做补0的动作
: 所以希望能在py这部分就处理掉
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.247.1 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1577247803.A.76C.html
1F:推 cuteSquirrel: 推。csv的观念解析 12/25 14:01
2F:推 moonbright: 给推~ 解释蛮好的! 12/25 14:17
3F:推 kobe760903: 请问一下我在to_csv是整数1都会变成1.0是为什麽呢 12/25 16:08
4F:推 kobe760903: 试了dtype=str好像就解决了 12/25 16:14
这好像跟我的理解有所不同,如果是浮点数的话,会取到小数点後的最大有效值
,比如说:
1.903900 -> 1.9049
2.410000 -> 2.41
3.541130 -> 3.54113
如果是整数的话,出来应该依然还是整数而不会被转换。另一个可能的状况是由
於有 NaN 的存在所进行的型态转换:
https://bit.ly/2Qev3Iy
> In the absence of high performance NA support being built into NumPy
> from the ground up, the primary casualty is the ability to represen
> NAs in integer arrays.
>
> This trade-off is made largely for memory and performance reasons,
> and also so that the resulting Series continues to be “numeric”.
>
> If you need to represent integers with possibly missing values, use
> one of the nullable-integer extension dtypes provided by pandas:
>
> Int8Dtype, Int16Dtype, Int32Dtype, Int64Dtype
转字串应该会比较快一点...
5F:→ kobe8112: 我自己用其他程式处理CSV的时候如果中间被Excel存取过也 12/25 16:55
6F:→ kobe8112: 很容易出问题,常见的坑都是Windows在档案/编码乱搞 12/25 16:58
试算表工具可以拿来开启 csv 档案,但 csv 档案并不具备试算表的详细格式,
这是很多人常常会搞不清楚的,要用试算表开启 csv 档案,建议使用汇入的方
式而非直接开启,除此之外建议保存时另存新档。
甚至我之前也有遇过 Excel 汇入 csv 之後,他的 parser 抓错没有成功汇入的
状况。
※ 编辑: Hsins (140.112.247.1 台湾), 12/25/2019 18:26:21
7F:推 nepholi: 我用纯文字编辑器打开的确卡号的前置0还在 所以是我太 12/26 10:52
8F:→ nepholi: 下意识地认为要用EXCEL开CSV了= = 原来一直都没事 12/26 10:53
9F:→ nepholi: 感谢大大 12/26 10:53