安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

跟最烦用Python处理时间了说拜拜

7月15日 吴梦筱投稿
  文:李晓飞
  来源:Python技术
  人生苦短,我用Python!,这句话是激励无数人,踏上了Python的伟大征程的座右铭。
  但是,Python中的时间处理,搞得我怀疑人生,总是弄不清该用time还是datetime,什么时间戳、时间运算、各种格式的时间转化,概念多,操作复杂,bug还得找半天,实在是太麻烦了,一遇到时间处理就焦虑
  今天给大家介绍一个处理时间的神器Pendulum〔1〕,跟过去说拜拜,让你用Python处理时间快步如飞,还等啥,来吧!神器亮相
  Python中神器亮相的姿势都差不多,有种熟悉的味道:pipinstallpendulum
  顺利安装后,展示一下:importpendulumd1pendulum。yesterday()昨天20211002T00:00:0008:00d2pendulum。today()今天20211003T00:00:0008:00d3pendulum。tomorrow()明天20211004T00:00:0008:00d2。diff(d1)。indays()相差多少天1d2。diff(d1)。inhours()相差多少小时47pendulum。now()现在的时间
  是不是感觉很有亲和力,各种操作都符合人性化。
  而且将datetime和time两个库合并了,再也不用纠结应该用哪个了。
  下面浏览一下Pendulum的更大威力吧。搞定时区
  时区处理是比较麻烦地事情,还好我们只使用一个时区,省去了很多麻烦。
  不过时区的概念需要了解,再说,谁能说得准,不开发国际化程序呢。
  一起困难,Pendulum让我们优雅处之。
  看例子:importpendulumdt1pendulum。datetime(2021,10,3)print(dt2。timezone。name)UTCdt2pendulum。datetime(2021,10,3,tzAsiaShanghai)print(dt2。timezone。name)AsiaShanghai不指定,就是默认的UTC0时区创建时间对象时可以指定时区,例如我们的时区名称是AsiaShanghai通过timezone。name属性,可查看时间对象的具体时区,或者直接用timezonename直接获取,另外,属性timezone可以简写成tz
  时区名称可在这里查:时区名称〔2〕
  Pendulum时区只支持用时区名称设置时区时区运算
  不同时区的时间可以用来比较、运算和转化,例如:importpendulumfirstpendulum。datetime(2012,9,5,23,26,11,0,tzAmericaToronto)secondpendulum。datetime(2012,9,5,20,26,11,0,tzAmericaVancouver)first。todatetimestring()2012090523:26:11first。timezonenameAmericaTorontosecond。todatetimestring()2012090520:26:11second。timezonenameAmericaVancouverfirstsecondTruefirst!secondFalsefirstsecondFalsefirstsecondFalsefirstfirst。on(2012,1,1)。at(0,0,0)secondsecond。on(2012,1,1)。at(0,0,0)tzisstillAmericaVancouverforsecondfirstsecondFalsefirst!secondTruefirstsecondFalsefirstsecondTruesecond。diff(first)。inhours()3时区AmericaToronto和AmericaVancouver相差3小时设置相差3小时的时间,两者是相等的设置完全相同的时间,比较时是不相等的,计算它们之间的差异,可以看到相差3小时diff方法用于与另一个时间对象比较,inhours方法是时间区间的方法,可以将区间转化为小时,同理还有indays、inyears等时区切换
  切换时区很方便,只要调用时间对象的intimezone或者缩写形式intz传入参数时区名称就可以了:importpenduluminperkpendulum。now()inperkDateTime(2021,10,4,12,10,59,986047,tzinfoTimezone(AsiaShanghai))inperk。intimezone(AmericaNewYork)DateTime(2021,10,4,0,7,50,106336,tzinfoTimezone(AmericaNewYork))时间运算
  时间运算包括比较、计算差异和增减。上面例子中已经计算了不同时区的时间差异,下面我们详细的说一下。比较
  比较很简单,对两个时间对象做比较就可以了,支持、!、、、、,比较的结果是True或False计算差异
  前面时区的例子里已经看到了,使用diff方法来计算差异,会返回一个时间区间(Period)对象
  使用diff时,如果不提供比较参加,就会默认和当前时间比较。importpendulumfirstpendulum。datetime(2012,1,31,0)secondpendulum。datetime(2012,2,1,0)first。diff(second)Period〔20120131T00:00:0000:0020120201T00:00:0000:00〕first。diff()Period〔20120131T00:00:0000:0020211004T04:44:56。33798900:00〕
  对于时间区间(period)来说,处理前面提到的indays等方法,将区间转化为一个单位的数量,还可以直接使用对应的属性,例如days、years、weeks等,效果是一样的。增减
  如果要的时间增加或者减少某些时间,可以使用add和subtract方法:importpendulumdtpendulum。datetime(2012,1,31)dtdt。add(years5)2017013100:00:00dtdt。add(years1)2018013100:00:00dtdt。subtract(years1)2017013100:00:00dtdt。subtract(years5)2012013100:00:00dtdt。add(months60)2017013100:00:00dtdt。add(months1)2017022800:00:00dtdt。subtract(months1)2017012800:00:00dtdt。subtract(months60)2012012800:00:00dtdt。add(days29)2012022600:00:00dtdt。add(days1)2012022700:00:00dtdt。subtract(days1)2012022600:00:00dtdt。subtract(days29)2012012800:00:00dtdt。add(weeks3)2012021800:00:00dtdt。add(weeks1)2012022500:00:00dtdt。subtract(weeks1)2012021800:00:00dtdt。subtract(weeks3)2012012800:00:00dtdt。add(hours24)2012012900:00:00dtdt。add(hours1)2012022501:00:00dtdt。subtract(hours1)2012022900:00:00dtdt。subtract(hours24)2012012800:00:00dtdt。add(minutes61)2012012801:01:00dtdt。add(minutes1)2012012801:02:00dtdt。subtract(minutes1)2012012801:01:00dtdt。subtract(minutes24)2012012800:00:00dtdt。add(seconds61)2012012800:01:01dtdt。add(seconds1)2012012800:01:02dtdt。subtract(seconds1)2012012800:01:01dtdt。subtract(seconds61)2012012800:00:00dtdt。add(years3,months2,days6,hours12,minutes31,seconds43)2015040312:31:43dtdt。subtract(years3,months2,days6,hours12,minutes31,seconds43)2012012800:00:00add和subtract方法参数一致,支持years、months、weeks等多种时间单位,而且可以一起设置时间单位参数可以支持负数,相当于add和subtract可以相互替换时间单位参数还支持小数,比如加上一天半可以写成dt。add(days1。5)时间调整
  时间调整很有用,之前我在约马程序中,需要计算下一个周一,当时只能通过日期API摸,当时要是知道Pendulum就省事多了:importpendulumdtpendulum。datetime(2012,1,31,12,0,0)dt。startof(day)2012013100:00:00dt。endof(day)2012013123:59:59dt。startof(month)2012010100:00:00dt。endof(month)2012013123:59:59dt。startof(year)2012010100:00:00dt。endof(year)2012123123:59:59dt。startof(decade)2010010100:00:00dt。endof(decade)2019123123:59:59dt。startof(century)2000010100:00:00dt。endof(century)2099123123:59:59dt。startof(week)2012013000:00:00dt。dayofweekpendulum。MONDAYTrueISO8601weekstartsonMondaydt。endof(week)2012020523:59:59dt。dayofweekpendulum。SUNDAYTrueISO8601weekendsonSUNDAYdt。next(pendulum。WEDNESDAY)2012020100:00:00dt。dayofweekpendulum。WEDNESDAYTruedtpendulum。datetime(2012,1,1,12,0,0)dt。next()2012010800:00:00dt。next(keeptimeTrue)20120108T12:00:0000:00dtpendulum。datetime(2012,1,31,12,0,0)dt。previous(pendulum。WEDNESDAY)2012012500:00:00dt。dayofweekpendulum。WEDNESDAYTruedtpendulum。datetime(2012,1,1,12,0,0)dt。previous()2011122500:00:00dt。previous(keeptimeTrue)2011122512:00:00startpendulum。datetime(2014,1,1)endpendulum。datetime(2014,1,30)start。average(end)2014011512:00:00othersthataredefinedthataresimilarandthaacceptmonth,quarterandyearunitsfirstof(),lastof(),nthof()
  是否看眼花了,我看到这里,兴奋地都要跳起来了,简直是只有没想到的,没有它没实现的呀!startof方法用于计算某个起始时间,可以是天、年、月、周,甚至可以是世纪。endof是类似的,用于计算结束next方法用于计算以一个星期,不加参数就是计算下个星期的今天,也可以指定计算下一个哪天,比如下个星期一:dt。next(pendulum。MONDAY)。previous是类似的,用于计算向前的天average方法用于计算两个时间的中间时间,简直太方便了时间转字符串
  时间对象是一个复杂的对象,对于我们来说不方便看和读,就需要将起转化为字符串,或者将字符串表示的时间转化为时间对象。
  Pendulum提供和很多方便的方式:importpendulumdtpendulum。datetime(1975,12,25,14,15,16)print(dt)19751225T14:15:1600:00dt。todatestring()19751225dt。toformatteddatestring()Dec25,1975dt。totimestring()14:15:16dt。todatetimestring()1975122514:15:16dt。todaydatetimestring()Thu,Dec25,19752:15PMYoucanalsousetheformat()methoddt。format(ddddDo〔of〕MMMMYYYYHH:mm:ssA)Thursday25thofDecember197502:15:16PMOfcourse,thestrftimemethodisstillavailabledt。strftime(AdtofBYI:M:Sp)Thursday25thofDecember197502:15:16PMtodatestring转化日期todatetimestring转化日期和时间totimestring转化时间toformatteddatestring转化为英文书写形式format安装指定格式转化strftime同datetime的格式化方法
  时间转化字符串,如何将字符串转化为时间类型呢?
  使用parse方法就好了,看下例子:importpendulumdtpendulum。parse(19750521T22:00:00)print(dt)19750521T22:00:0000:00Youcanpassatzkeywordtospecifythetimezonedtpendulum。parse(19750521T22:00:00,tzEuropeParis)print(dt)19750521T22:00:0001:00NotISO8601compliantbutcommondtpendulum。parse(1975052122:00:00)dtpendulum。parse(310101,strictFalse)dtpendulum。parse(310101,strictFalse)dtpendulum。parse(3111,strictFalse)可以直接转化,也可以在转化时指定时区支持多种时间格式,如果不是标准的时间格式,需要添加参数strictFalse,这样Pendulum就会尽最大可能去猜更多的时间格式请参考PendulumParsing文档〔3〕人性化
  现在看到Pendulum的强大了吧,不过还有个令人叫绝的功能,就是人性化时间。
  如果你注意搜索引擎的结果的话,就能看到,很多时间被表示为:1天前,2周后等等,如果让我们来实现,可得好好想想,如果需求说,搞个英文版的,我们可能有拿起键盘去砸的冲动。
  现在好了,直接看例子:importpendulumpendulum。now()。subtract(days1)。diffforhumans()1dayagopendulum。now()。diffforhumans(pendulum。now()。subtract(years1))1yearafterdtpendulum。datetime(2011,8,1)dt。diffforhumans(dt。add(months1))1monthbeforedt。diffforhumans(dt。subtract(months1))1monthafterpendulum。now()。add(seconds5)。diffforhumans()5secondsfromnowpendulum。now()。subtract(days24)。diffforhumans()3weeksagopendulum。now()。subtract(days24)。diffforhumans(absoluteTrue)3weekspendulum。setlocale(zh)pendulum。now()。subtract(days24)。diffforhumans()3周前pendulum。now()。add(seconds5)。diffforhumans()5秒钟后onedaypendulum。now()。diff(pendulum。now()。add(days1))oneday。inwords()1天diffforhumans可以将时间区间直接输出成人性化时间参数absolute的作用是给出一个人性化的时间间隔,而不是相对于现在的说法默认情况下输出的是英语写法,如果要让说中文,通过pendulum。setlocale(zh)就可以了,厉害吧对于一个时间区域来说,可以用inwords来输出人性化时间
  这里注意,对于dt。diffforhumans(dt。subtract(months1))这样的,相对一个日期的时间差异人性化输出,不支持中文,会报错,所以建议先计算出两个日期的差异,再用inwords做人性化输出,如果有必要,在其后加上前或后。
  希望这个bug能早日修复总结
  今天简单介绍了一下Pendulum库在时间上的优秀能力,除了这些它还有更多的功能可供发掘。只要多研究,多用,一定能解决你遇到时间处理的问题。
  最好的学就是用,所以要不断地通过练习或者实践去用,期望通过这篇介绍,能让你在时间处理上更高效,比心!
投诉 评论

为什么清华北大的都喜欢到烟草局上班?到哪上班都是为人民服务。烟草涉及千百万人民群众的生活,去烟草局能能更好的为更多的人民服务。用高科技的学识知识为人民服务是理想变现实的最好途径。你不抽我不抽!航母谁来修……小米11Pro跌至新低价,256GB2K屏幕IP68,依旧值关注数码圈的都知道,今年3月份,主流手机厂商都在扎堆举办旗舰手机发布会。其中,红米K50系列,荣耀Magic4系列,iPhoneSE3等机型,目前依旧是某些网友津津乐道的话题。……跟最烦用Python处理时间了说拜拜文:李晓飞来源:Python技术人生苦短,我用Python!,这句话是激励无数人,踏上了Python的伟大征程的座右铭。但是,Python中的时间处理,搞得我……美国为什么要向三星和台积电索要数据,背后有什么深层原因?美国的霸权主义是无所不在的!美国的科技霸权是支撑其全球军事霸权的核心,军事霸权又是支撑经济霸权和美元霸权的保证,经济霸权和美元霸权又为政治霸权提供金钱保障,政治霸权最终负责分配……武器禁运和国际制裁对一个军事大国影响有多大?武器禁运和国际制裁是指某些发达国家联合起来向一国禁止出口各类军备武器,战略物资,高科技技术等,并时常伴随有经济方面的制裁限制。任何问题都有两面性,武器禁运和国际制裁也不例外。……第一次发射卫星,第一次人类进入太空和第一次登月,对于人类来说人类踏上月球的第一个脚印既然是个科学问题,那就从科学角度上来谈,从科学意义和价值上来谈。三句话三个历史性事件,咱们先来简单介绍一下具体情况。1,1957年10月4日前苏联……一部手机的寿命是多少?什么是影响手机寿命的罪魁祸首?一部手机的寿命是多少?一般来说,一部新手机在使用过程中会经历以下几个阶段:1、新手机到手,续航能力强,流畅运行各种app、游戏。2、使用1。52年后,加载大体……什么样的落地页能够提升竞价账户的转化率?先看个案例,看到下面这个落地页,我的第一感觉是:设计需谨慎,且行且珍惜。能在一个页面中完美的嵌入每一个页面设计都忌讳的坑,也是难能可贵。这个页面,不管整体结构、页面排版、图片选……报告称苹果MR头盔配备3块显示屏今年推出财经网科技1月5日讯,据新浪科技消息,显示器分析师RossYoung在最近的报告中指出,苹果MR头盔将于2022年推出,它配备3块显示屏。3块显示屏包括两块MicroOL……国家邮政局江苏率先基本实现快递服务建制村全覆盖国家邮政局数据显示,江苏省13790个建制村中,13778个村已通达4个以上品牌快递服务,通达率为99。91,13354个村已通达7个以上品牌快递服务,通达率为96。83。……警察可以查看微信记录吗?视频加载中。。。微信已经成为人们生活中必不可少的通信工具,很多人生活、办公、娱乐都在微信上,那么警察可以查看手机微信聊天内容或者检查微信记录吗?大家好,我是法律深猴,本期……试驾比亚迪唐DMi,一箱油跑1000公里毫无压力,驾控有趣尽管近几年来纯电动汽车产业迅速崛起,并已成为未来必然的发展趋势,但距离纯电动化全面普及,仍需要一段漫长的发展时间。在此之前,混合动力车型或许会是人们最理想的选择。但目前市面上的……
杀疯了!realme五大机型决战618,卢伟冰该如何接招?这几款手机比较适合在外打工的人融资丨朴朴超市完成战略融资,IDG资本及老股东领投vivoX80Pro已量产,4700mAh4nm芯片,堆料很centos系统samba配置为iPhone14准备的?苹果全新充电头曝光,史诗级提升如果你被隔离1个月,只有一部老年机,你会怎么样?为什么一些人认为深圳会跌出一线城市?暑假不许补课?强监管下教培机构将趋向规范4月6日新股688125安达智能申购分析苹果电池使用小心得分享Java设计模式23种设计模式(万字图文全面总结)婶子大娘一大堆,孩子依然进了福利院未来十年电动汽车投资额将达3000亿美元中国占一半元旦去哪里旅游好(元旦带孩子去哪里旅游最好)abs工程塑料(abs可调节支架)中学生哲理故事作文素材集锦有关谦虚礼让的小故事被继承人的养老保险是否继承?借白俄罗斯运动员叛逃之机,美国总统拜登对白俄实施严厉制裁!面尴尬号称不用排队的亚马逊无人店开店首日最大问题是上古四大神兽:青龙、白虎、玄武、朱雀(附图片)杨钰莹把自己活成了豪门,皮草配4万6包,歪头卖萌俏皮惹人爱如何仅用一只耳机即可启用AirPodsPro降噪功能

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利