在pandas中保存Excel文件的日期字段(只保留年月日)
在使用pandas保存日期数据时,我们经常会只希望保存成日期类型,即类似2021-01-16的格式。但是由于pandas的Timestamp类可以处理时分秒,如果不进行处理,默认情况下,在输出成Excel文件时,会将字段处理成如下形式:
下面我们通过一个小程序演示如何处理日期字段,使字段即可以保留日期类型,又可以避免保存文件时出现时分秒。之所以不将字段处理为字符串类型,是为了解决某些特殊场合我们还希望使用日期类型带给我们的一些专属的操作,比如日期比较,或者加减等等。
pandas中的时间类型是Timestamp类,它是datetime模块中datetime类的子类。而一个datetime对象,包含了date对象和time对象的所有信息。date对象只包含年月日的信息。基于以上的逻辑关系,如果我们在最后保存Excel文件的时候,可以把Timestamp对象转换成date对象,就将在字段上只保留年月日信息了。好了,逻辑关系和思路都有了,下面我们看一下具体实现的源代码吧。
为了演示,我们使用了一个测试文件test.xlsx,文件的内容如下:
在这个文件中,发放日期字段是一个日期类型,而且只包含年月日。程序的第12行,我们使用read_excel就可以正确地读取这个字段。大家一定要注意,由于我们的Excel单元格是日期类型,所以我们的read_excel才会直接就识别出日期时间类型。Excel的单元格格式如下:
如果这里我们的Excel文件单元格格式为"文本"。
那么我们在使用read_excel时,就要在参数dtype中指定字段的类型为datetime64才可以(注意,源代码的上方会有import numpy as np,图片显示得不方便,我就不展示了)。读取的源代码例如:
好了,解决了读取的问题,下面我们再说一下保存的问题。通过程序的第15行,我们查看一下DataFrame对象中各字段的类型。
发放日期的类型目前是datetime64,如果默认输出成Excel文件,例如程序的第17行,而输出的结果就不仅含有年月日信息,还会包含时分秒的信息。文件格式如下图所示:
如果我们只希望字段包含年月日的话,我们可以使用DataFrame的date()方法,返回一个date对象,并且将整个字段都处理成date类型。这样再输出Excel文件时,就会只包含年月日的信息了。程序的第19行我们利用apply进行了一次行级函数应用,将"发放日期"类型由DataFrame转换为date类型,从而去掉时分秒等相关信息,只保留年月日信息。最后我们再输出Excel文件时就可以看到,"发放日期"字段只保留了年月日,而且在整个程序的处理过程中,我们没有将字段转为字符串,从而保留了很多日期类型的便利操作,比如日期类型的比较大小。
以上就是在pandas中读取和保存日期类型的基本方法,程序的逻辑并不复杂,主要是理解好Timestamp,datetime,date,time这几个类的关系,以及处理它们的思路,希望对大家的工作能有所帮助。
我使用的环境:Windows 7 + Python 2.7.17 + PyCharm Community Edition 2016.1.5
如果大家认为我的文章还可以,真心希望能帮我点一个"关注",粉丝的数量真的对我很重要,也算是对我努力结果的一个支持,谢谢大家了。