当前位置: 首页 > 后端技术 > Python

傻傻分不清系列-Python中各种时间处理方法(下)

时间:2023-03-25 22:03:16 Python

相信大部分数据分析师在开始接触Python的时候,在学习time库和datetime库的时候,都会对这两个库很熟悉。各种非常相似又相互关联的类和方法,让人觉得很暖心。当我接触到pandas处理时间序列的方法时,发现各种类和方法与前两个时间库的方法“看起来和好像有点不一样”。这时候,每一个强迫症患者都要早早地发出“土拨鼠的叫声”。托福司机趁着宅在家躲疫情的空档,重新梳理了这3条知识内容,及时制止了心中的土拨鼠继续叫喊。现在分享给大家。(一)时间库1.时间库与datetime库的关系在Python文档中,时间被归类在GenericOperatingSystemServices中。也就是说,它提供的功能更接近于操作系统层面。datetime库比time库高级很多,提供了更实用的方法。可以理解为datetime是根据时间进行封装的。我们先来看看时间库。时间库主要围绕unix时间戳进行操作,主要包括一个类:struct_time。那么什么是unix时间戳?指从格林威治标准时间1970年1月01日00:00(北京时间1970年1月1日08:00:00)到现在的总秒数,比如1970年1月01日格林威治标准时间01日00分01秒就是记录值为1,时间库中只要有四个函数就可以获取时间函数,time.time()方法可以获取当前时间戳:比如我们要获取当前的unixtimestamp,unix时间戳记录为浮点数:获取本地时区的unix时间Stamp:这里我们会发现上面的Unix时间戳不再记录为浮点数,而是一个struct_time对象,其中包含一共九个时间元素,分别是年月日时分秒,tm_wday是星期几(星期一为0),tm_yday是一年中的第几天,tm_isdst是夏令时.另外,time.localtime()还可以将unix时间戳转换成struct_time格式:2、struct_time对象的格式化时间库中格式化时间的方法主要是通过time.strftime()方法。基本用法如下:ltime.strftime(tpl,ts)§tpl:格式化模块字符串,用于定义输出效果§ts:计算机内部时间类型变量,一般使用struct_time对象该方法返回的对象实际上是一个字符串,例如上面的struct_time对象gmtime进行时间格式转换:上面的'%Y-%m-%d%H:%M:%S'用于转换strcut_time对象的格式字符串,在另外:这个表很重要,datetime库中的对象和pandas的datetimeSeries对象都可以用于日期格式化操作。而如果我们要把字符时间转换成struct_time对象,可以使用time.strptime()方法,格式正好对应time.strftime()方法。比如有一个字符串时间'2020-02-0116:49:11',需要转成一个struct_time对象:3.时间库中的休眠时间时间库中最常用的方法是time.sleep(),比如我们想让程序等待3.3秒再输出,我们可以写time.sleep(3.3)time.sleep()方法在爬虫等各种程序中被广泛使用,所以我不会再重复了。(2)datetime库datetime库可以说是时间库的高级封装。与时间库相比,日期时间库在各种日期数据处理方面有了进一步的升级。datetime库主要记录时间类,包括datetime.date、datetime.time、datetime.datetime。1、datetime.date类在datetime库中,可以通过datetime.date()方法生成年月日时间,返回对象为datetime.date类。这里需要注意的是,datetime.date类只记录年月日三个时间元素,不记录时分秒等其他时间元素。在datetime.date()方法中通过参数year、month、day指定年、月、日三个时间元素。我们可以通过datetime.date.today()方法获取当前日期,该方法返回的对象也是datetime.date类。(1)datetime.date类的属性另外,datetime.date类常用的属性有年、月、日。参数均为整数:(2)datetime.date类时间格式化方法datetime.date类时间格式化方法也叫strftime(),比如我们有datetime.date对象date_samp如下:直接通过调用日期时间.日期对象。strftimie()方法对指定的时间格式进行如下转换:格式字符串可以参考之前时间库中的表。这里你会发现虽然格式化方法的strftime()的名字和之前一样,格式化字符串也和之前的时间库一样,但是调用方式不一样,这也是为什么很多同学有两个时间库的排版方式总是导致不小心打错字。当然像上面这样用这么复杂的格式字符串来转换普通的字符串日期类型就太麻烦了。其实datetime.date对象可以直接使用方法.isoformat()进行转换:和datetime.date类的属性类似,datetime.time类也有类似的属性:时间格式化的方法是与datetime.date类相同,也是由datetime.time对象的.strftime()方法调用:(3)unix时间如何将时间库中的unix时间戳转换成datetime.date类?只需使用实例方法.fromtimestamp()。比如我们有当前时间戳current_timestamp:如果我们想获取上面时间戳中的日期,可以使用datetime.date.fromtimestamp()方法直接转换:当然return也是datetime.date的一个对象班级。4.datetime.time类datetime库中的datetime.time类用于记录时间,包括时、分、秒、毫秒。datetime.time()方法可以创建datetime.time类的对象,参数包括时、分、秒、微秒。datetime.time类的属性:[](https://mp.toutiao.com/profile...时间格式化的方法和datetime.date类一样,也是通过.strftime()datetime.time对象的方法调用:[](https://mp.toutiao.com/profil...上面可以看到,datetime.time对象的.strftime()方法返回的对象是也是一个字符串。同理,datetime.time对象也有.isoformat()方法:[](https://mp.toutiao.com/profil...但需要注意的是,datetime.time对象没有.fromtimestamp()方法进行时间戳转换5.datetimedatetime类的对象datetime.datetime主要用来记录年月日时分秒等时间单位,我们可以把它看成一个datetime.date类和datetime.time类的“组合”。创建datetime.datetime类对象的方法与datetime.time类基本相同。参数包括年、月、日、时、分、秒nd和微秒。但至少必须包括三个参数:年、月和日。[](https://mp.toutiao.com/profil...datetime.datetime类的时间格式化方式也是.strftime(),格式化字符串也和前面一致:[](https://mp.toutiao.com/profil...datetime.datetime对象的.isoformat()方法返回的结果有点“不一样”,日期和时间之间多了一个字符'T':[](https://mp.toutiao.com/profil...而如果你想快速获取当前日期和时间,可以使用datetime.datetime.now():6.datetime.timedeltaclassdatetime.timedeltaclass用于记录时间间隔类,将这个类加减到一个时间点,得到一个新的时间。datetime.timedelta()方法可用于创建datetime.timedelta对象。参数包括天、小时、分钟、秒和微秒。比如我们创建一个45天6小时的时间间隔:[](https://mp.toutiao.com/profil...时间间隔对象生成后,可以使用datetime对象进行加减it:[](https://mp.toutiao.com/profil...(3)时间库和datetime库之间的时间对象看到这里,相信很多同学心中的土拨鼠都在尖叫:东西太多了toremember,对我来说太难了~确实,在使用Python编写爬虫等程序的时候,经常需要用到time库和datetime库中的各种时间对象,最麻烦的地方往往就是各种时间格式的转换。其实在了解了time库和datetime库的各个类和属性方法之后,记住下面这张图可以事半功倍:[](https://mp.toutiao.com/profil...走一遍流程想想看:string类型时间转换datetime.datetime对象,使用datetime.datetime.strptime()方法:[](https://mp.toutiao.com/profile...datetime.datetime转字符串,使用datetime.datetime实例的.strftime()方法:[](https://mp.toutiao.com/profile...struct_time转struct_time,使用time.strptime()方法:[](https://mp.toutiao.com/profile...struct_time转struct_time,使用time.strftime()方法:[](https://mp.toutiao.com/profile...struct_time转unix时间戳,使用time.mktime()方法:[](https://mp.toutiao.com/profil...unixtimestamp转struct_time,使用time.gmtime()或time.localtime()方法:今天我们结合时间库和datetime库的几种主要时间对象方法道理很清楚,同时其相互的规律转化也被总结和归纳。空间有限。在接下来的系列文章中,我们将继续讨论pandas库中时间对象与time库和datetime库中对象的关系。