范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  文:李晓飞
  来源:Python 技术
  人生苦短,我用 Python! ,这句话是激励无数人,踏上了 Python 的伟大征程的座右铭。
  但是,Python 中的时间处理,搞得我怀疑人生,总是弄不清该用 time 还是 datetime,什么时间戳、时间运算、各种格式的时间转化,概念多,操作复杂,bug 还得找半天,实在是太麻烦了,一遇到时间处理就焦虑~
  今天给大家介绍一个处理时间的神器 ——  Pendulum[1] ,跟过去说拜拜,让你用 Python 处理时间快步如飞,还等啥,来吧!神器亮相
  Python 中神器亮相的姿势都差不多,有种熟悉的味道: pip install pendulum
  顺利安装后,展示一下: import pendulum  d1 = pendulum.yesterday()  # 昨天 # 2021-10-02T00:00:00+08:00  d2 = pendulum.today() # 今天 # 2021-10-03T00:00:00+08:00  d3 = pendulum.tomorrow() # 明天 # 2021-10-04T00:00:00+08:00  d2.diff(d1).in_days() # 相差多少天 # 1  d2.diff(d1).in_hours() # 相差多少小时 # 47  pendulum.now() # 现在的时间
  是不是感觉很有亲和力,各种操作都符合人性化。
  而且将 datetime 和 time 两个库合并了,再也不用纠结应该用哪个了。
  下面浏览一下 Pendulum 的更大威力吧。 搞定时区
  时区处理是比较麻烦地事情,还好我们只使用一个时区,省去了很多麻烦。
  不过时区的概念需要了解,再说,谁能说得准,不开发国际化程序呢。
  一起困难,Pendulum 让我们优雅处之。
  看例子: import pendulum  dt1 = pendulum.datetime(2021, 10, 3) print(dt2.timezone.name) # UTC  dt2 = pendulum.datetime(2021, 10, 3, tz="Asia/Shanghai")  print(dt2.timezone.name) # Asia/Shanghai 不指定,就是默认的 UTC 0 时区 创建时间对象时可以指定时区,例如我们的时区名称是  Asia/Shanghai 通过  timezone.name  属性,可查看时间对象的具体时区,或者直接用 timezone_name  直接获取,另外,属性 timezone  可以简写成 tz
  时区名称可在这里查: 时区名称[2]
  Pendulum 时区只支持用 时区名称 设置时区时区运算
  不同时区的时间可以用来比较、运算和转化,例如:import pendulum  first = pendulum.datetime(2012, 9, 5, 23, 26, 11, 0, tz="America/Toronto") second = pendulum.datetime(2012, 9, 5, 20, 26, 11, 0, tz="America/Vancouver")  first.to_datetime_string() # 2012-09-05 23:26:11  first.timezone_name # America/Toronto second.to_datetime_string() # 2012-09-05 20:26:11 second.timezone_name # America/Vancouver  first == second # True first != second # False first > second # False first < second # False  first = first.on(2012, 1, 1).at(0, 0, 0) second = second.on(2012, 1, 1).at(0, 0, 0) # tz is still America/Vancouver for second  first == second # False first != second # True first > second # False first < second # True  second.diff(first).in_hours() # 3 时区  America/Toronto  和 America/Vancouver  相差 3 小时设置相差 3 小时的时间,两者是相等的 设置完全相同的时间,比较时是不相等的,计算它们之间的差异,可以看到相差 3 小时 diff  方法用于与另一个时间对象比较,in_hours  方法是时间区间的方法,可以将区间转化为小时,同理还有 in_days 、in_years  等时区切换
  切换时区很方便,只要调用时间对象的 in_timezone  或者 缩写形式 in_tz  传入参数 时区名称  就可以了:import pendulum in_perk = pendulum.now() in_perk # DateTime(2021, 10, 4, 12, 10, 59, 986047, tzinfo=Timezone("Asia/Shanghai"))  in_perk.in_timezone("America/New_York") # DateTime(2021, 10, 4, 0, 7, 50, 106336, tzinfo=Timezone("America/New_York")) 时间运算
  时间运算包括比较、计算差异 和 增减。上面例子中已经计算了不同时区的时间差异,下面我们详细的说一下。比较
  比较很简单,对两个时间对象做比较就可以了,支持 == 、!= 、> 、>= 、< 、<= ,比较的结果是 True  或 False 计算差异
  前面时区的例子里已经看到了,使用 diff  方法来计算差异,会返回一个时间区间(Period )对象
  使用 diff  时,如果不提供比较参加,就会默认和当前时间比较。import pendulum  first = pendulum.datetime(2012, 1, 31, 0) second = pendulum.datetime(2012, 2, 1, 0) first.diff(second) #  2012-02-01T00:00:00+00:00]>  first.diff() #  2021-10-04T04:44:56.337989+00:00]>
  对于时间区间(period )来说,处理前面提到的 in_days  等方法,将区间转化为一个单位的数量,还可以直接使用对应的属性,例如 days 、years 、weeks  等,效果是一样的。增减
  如果要的时间增加或者减少某些时间,可以使用 add  和 subtract  方法:import pendulum  dt = pendulum.datetime(2012, 1, 31)  dt = dt.add(years=5) # "2017-01-31 00:00:00" dt = dt.add(years=1) # "2018-01-31 00:00:00" dt = dt.subtract(years=1) # "2017-01-31 00:00:00" dt = dt.subtract(years=5) # "2012-01-31 00:00:00"  dt = dt.add(months=60) # "2017-01-31 00:00:00" dt = dt.add(months=1) # "2017-02-28 00:00:00" dt = dt.subtract(months=1) # "2017-01-28 00:00:00" dt = dt.subtract(months=60) # "2012-01-28 00:00:00"  dt = dt.add(days=29) # "2012-02-26 00:00:00" dt = dt.add(days=1) # "2012-02-27 00:00:00" dt = dt.subtract(days=1) # "2012-02-26 00:00:00" dt = dt.subtract(days=29) # "2012-01-28 00:00:00"  dt = dt.add(weeks=3) # "2012-02-18 00:00:00" dt = dt.add(weeks=1) # "2012-02-25 00:00:00" dt = dt.subtract(weeks=1) # "2012-02-18 00:00:00" dt = dt.subtract(weeks=3) # "2012-01-28 00:00:00"  dt = dt.add(hours=24) # "2012-01-29 00:00:00" dt = dt.add(hours=1) # "2012-02-25 01:00:00" dt = dt.subtract(hours=1) # "2012-02-29 00:00:00" dt = dt.subtract(hours=24) # "2012-01-28 00:00:00"  dt = dt.add(minutes=61) # "2012-01-28 01:01:00" dt = dt.add(minutes=1) # "2012-01-28 01:02:00" dt = dt.subtract(minutes=1) # "2012-01-28 01:01:00" dt = dt.subtract(minutes=24) # "2012-01-28 00:00:00"  dt = dt.add(seconds=61) # "2012-01-28 00:01:01" dt = dt.add(seconds=1) # "2012-01-28 00:01:02" dt = dt.subtract(seconds=1) # "2012-01-28 00:01:01" dt = dt.subtract(seconds=61) # "2012-01-28 00:00:00"  dt = dt.add(years=3, months=2, days=6, hours=12, minutes=31, seconds=43) # "2015-04-03 12:31:43" dt = dt.subtract(years=3, months=2, days=6, hours=12, minutes=31, seconds=43) # "2012-01-28 00:00:00" add  和 subtract  方法参数一致,支持 years 、months 、weeks  等多种时间单位,而且可以一起设置时间单位参数可以支持负数,相当于  add  和 subtract  可以相互替换时间单位参数还支持小数,比如加上一天半可以写成  dt.add(days=1.5) 时间调整
  时间调整很有用,之前我在约马程序 中,需要计算下一个周一,当时只能通过日期 API 摸,当时要是知道 Pendulum  就省事多了:import pendulum  dt = pendulum.datetime(2012, 1, 31, 12, 0, 0)  dt.start_of("day") # "2012-01-31 00:00:00"  dt.end_of("day") # "2012-01-31 23:59:59"  dt.start_of("month") # "2012-01-01 00:00:00"  dt.end_of("month") # "2012-01-31 23:59:59"  dt.start_of("year") # "2012-01-01 00:00:00"  dt.end_of("year") # "2012-12-31 23:59:59"  dt.start_of("decade") # "2010-01-01 00:00:00"  dt.end_of("decade") # "2019-12-31 23:59:59"  dt.start_of("century") # "2000-01-01 00:00:00"  dt.end_of("century") # "2099-12-31 23:59:59"  dt.start_of("week") # "2012-01-30 00:00:00" dt.day_of_week == pendulum.MONDAY # True # ISO8601 week starts on Monday  dt.end_of("week") # "2012-02-05 23:59:59" dt.day_of_week == pendulum.SUNDAY # True # ISO8601 week ends on SUNDAY  dt.next(pendulum.WEDNESDAY) # "2012-02-01 00:00:00" dt.day_of_week == pendulum.WEDNESDAY # True  dt = pendulum.datetime(2012, 1, 1, 12, 0, 0) dt.next() # "2012-01-08 00:00:00" dt.next(keep_time=True) # "2012-01-08T12:00:00+00:00"  dt = pendulum.datetime(2012, 1, 31, 12, 0, 0) dt.previous(pendulum.WEDNESDAY) # "2012-01-25 00:00:00" dt.day_of_week == pendulum.WEDNESDAY # True  dt = pendulum.datetime(2012, 1, 1, 12, 0, 0) dt.previous() # "2011-12-25 00:00:00" dt.previous(keep_time=True) # "2011-12-25 12:00:00"  start = pendulum.datetime(2014, 1, 1) end = pendulum.datetime(2014, 1, 30) start.average(end) # "2014-01-15 12:00:00"  # others that are defined that are similar # and tha accept month, quarter and year units # first_of(), last_of(), nth_of()
  是否看眼花了,我看到这里,兴奋地都要跳起来了,简直是只有没想到的,没有它没实现的呀!start_of  方法用于计算某个起始时间,可以是 天、年、月、周,甚至可以是世纪。end_of  是类似的,用于计算结束next  方法用于计算以一个星期,不加参数就是计算下个星期的今天,也可以指定计算下一个哪天,比如下个星期一:dt.next(pendulum.MONDAY) 。previous  是类似的,用于计算向前的天average  方法用于计算两个时间的中间时间,简直太方便了时间转字符串
  时间对象是一个复杂的对象,对于我们来说不方便看和读,就需要将起转化为字符串,或者将字符串表示的时间转化为时间对象。
  Pendulum  提供和很多方便的方式:import pendulum  dt = pendulum.datetime(1975, 12, 25, 14, 15, 16) print(dt) # "1975-12-25T14:15:16+00:00"  dt.to_date_string() # "1975-12-25"  dt.to_formatted_date_string() # "Dec 25, 1975"  dt.to_time_string() # "14:15:16"  dt.to_datetime_string() # "1975-12-25 14:15:16"  dt.to_day_datetime_string() "Thu, Dec 25, 1975 2:15 PM"  # You can also use the format() method dt.format("dddd Do [of] MMMM YYYY HH:mm:ss A") "Thursday 25th of December 1975 02:15:16 PM"  # Of course, the strftime method is still available dt.strftime("%A %-d%t of %B %Y %I:%M:%S %p") "Thursday 25th of December 1975 02:15:16 PM" to_date_string  转化日期to_datetime_string  转化日期和时间to_time_string  转化时间to_formatted_date_string  转化为英文书写形式format  安装指定格式转化strftime  同 datetime  的格式化方法
  时间转化字符串,如何将字符串转化为时间类型呢?
  使用 parse  方法就好了,看下例子:import pendulum  dt = pendulum.parse("1975-05-21T22:00:00") print(dt) # "1975-05-21T22:00:00+00:00  # You can pass a tz keyword to specify the timezone dt = pendulum.parse("1975-05-21T22:00:00", tz="Europe/Paris") print(dt) # "1975-05-21T22:00:00+01:00"  # Not ISO 8601 compliant but common dt = pendulum.parse("1975-05-21 22:00:00")  dt = pendulum.parse("31-01-01", strict=False)  dt = pendulum.parse("31/01/01", strict=False)  dt = pendulum.parse("31/1/1", strict=False) 可以直接转化,也可以在转化时指定时区 支持多种时间格式,如果不是标准的时间格式,需要添加参数  strict=False ,这样 Pendulum  就会尽最大可能去猜更多的时间格式请参考  Pendulum Parsing 文档[3] 人性化
  现在看到 Pendulum 的强大了吧,不过还有个令人叫绝的功能,就是人性化时间。
  如果你注意搜索引擎的结果的话,就能看到,很多时间被表示为:1天前,2周后等等,如果让我们来实现,可得好好想想,如果需求说,搞个英文版的,我们可能有拿起键盘去砸的冲动。
  现在好了,直接看例子:import pendulum  pendulum.now().subtract(days=1).diff_for_humans() # "1 day ago"  pendulum.now().diff_for_humans(pendulum.now().subtract(years=1)) # "1 year after"  dt = pendulum.datetime(2011, 8, 1) dt.diff_for_humans(dt.add(months=1)) # "1 month before" dt.diff_for_humans(dt.subtract(months=1)) # "1 month after"  pendulum.now().add(seconds=5).diff_for_humans() # "5 seconds from now"  pendulum.now().subtract(days=24).diff_for_humans() # "3 weeks ago"  pendulum.now().subtract(days=24).diff_for_humans(absolute=True) # "3 weeks"  pendulum.set_locale("zh") pendulum.now().subtract(days=24).diff_for_humans() # "3周前"  pendulum.now().add(seconds=5).diff_for_humans() # "5秒钟后"  oneday = pendulum.now().diff(pendulum.now().add(days=1)) oneday.in_words() # "1天" diff_for_humans  可以将时间区间直接输出成人性化时间参数  absolute  的作用是给出一个人性化的时间间隔,而不是相对于现在的说法默认情况下输出的是英语写法,如果要让说中文,通过  pendulum.set_locale("zh")  就可以了,厉害吧对于一个时间区域来说,可以用  in_words  来输出人性化时间
  这里注意,对于  dt.diff_for_humans(dt.subtract(months=1))  这样的,相对一个日期的时间差异人性化输出,不支持中文,会报错,所以建议先计算出两个日期的差异,再用 in_words  做人性化输出,如果有必要,在其后加上前  或 后 。
  希望这个 bug 能早日修复总结
  今天简单介绍了一下 Pendulum 库在时间上的优秀能力,除了这些它还有更多的功能可供发掘。只要多研究,多用,一定能解决你遇到时间处理的问题。
  最好的学就是用,所以要不断地通过练习或者实践去用,期望通过这篇介绍,能让你在时间处理上更高效,比心!

她出身护士,因不忠被废贵妃之位,如今圣宠回宫再陷宫斗泰王玛拉十世和他的爱妃们,仿佛活跃在娱乐圈的七八线小明星,隔三差五便撒一些绯闻丑闻,以搏八卦小报的榜首之位。而吃瓜群众们对泰国王室的爱恨情仇也是喜闻乐见。当然,这不能怪大家唇焦口燥中国快餐豪门没落史夫妻反目,母女成仇,出轨上位,锒铛入狱1987年11月,中国第一家肯德基在北京盛大开业,揭开了中国快餐行业的序幕。眼见着西洋快餐在中华大地上发展得如火如荼,中式快餐品牌也纷纷效仿,如雨后春笋拔地而起。其中,有这样一家快科技感满满!600款高科技全息信息图HUD动画本期我们给小伙伴带来一套超实用的AE脚本600款高科技全息信息图HUD动画一共包含600多个科技感全息HUD信息图形动态元素比如科技感线条动画圆环动画屏幕狂网格文字标题等。让你的作铁饭碗不铁了?公务员迎来改革,这类人需要小心了前言在竞争激烈的当今社会,人民群众最为关心的便是,自己的薪资是否合理,公司给自己上的保险等社会保障性福利是否完备。即使是在如今这个市场多元化,产业大变迁的时代,人们也渴望拥有一份长她是印度最好命的女人,不能生育,却被首富老公宠上天,为何?说起国内富豪的日常生活,大多带着丝忆苦思甜的烟火气息。比如吃着万达食堂的地产大亨王健林,比如热衷于苍蝇餐馆的玻璃大王曹德旺,再比如喜欢折扣商品的郭晶晶夫妇。中华五千年传承下来的财不他是美国首个亿万富翁,有164位情人,晚年精神错乱孤苦而终他,在美国无人不知无人不晓,虽不是政界人士,但赫赫之名与华盛顿林肯齐平。他少年时便家财万贯,壮年之期成美国首个亿万富翁他14岁会开飞机,34岁组建自己的私人空军队他豪掷万金,只爱好从擦鞋匠到首富,家产80亿,豪宅341所,掌掴官员,下场如何?2018年7月21日晚上,山西省的柳林县,夜幕照常降临。这一晚,平常却不平凡。山西警方出动数百全副武装的警力,将柳林县的煤矿大厦团团包围。同时间,一支潜伏已久的精锐小队在北京一所高她是最叛逆的豪门阔太,下农田逛菜场,是豪门没落还是坚守本心?豪门生活一直是吃瓜大众喜闻乐见的八卦所在。这里灯红酒绿,华服珠宝这里狗血恩怨,男女情仇当然少不了的,还有阶级分明的鄙视链。三十而已中手拎5万香奈儿包包的顾佳,站在拥有260万爱马仕预设全新网红INS时尚高级灰,这也太美了高级灰这一概念原本出自时尚圈它的稳重和谐给人一种韵味无穷的感觉高级灰在近几年席卷了时尚设计摄影各种领域大家纷纷迷上了这蒙着一层灰的低纯度中性色调beforeafter本期我们给小伙他是北京首富,也是头号软饭王,坐拥80亿身家,晚年遭亲人反目如果你的生活原本穷困潦倒,却意外收获了一笔泼天财富,那你是否还会在原有生活轨道上驰骋,或是挥金如土,宛若重生一世?他叫李春平。上世纪70年代,中国的产线工人在为月入百元欣喜不已时,她是张艺谋心中的痛,因北京奥运会高位截瘫,事业崩塌遭男友抛弃曾经,刘岩是天之娇女,张艺谋力邀她在北京奥运开幕式上独自起舞命运的瞬间,她从鸟巢舞台上跌落,下身瘫痪,不说舞蹈就连行走都是困难张艺谋对媒体说我这辈子最愧对的就是刘岩,她是我心中永远
适合送女朋友的电竞鼠标推荐作为游戏玩家中的少数群体,女生玩家一直是容易被外设厂商所忽视的群体,甚至会显得有些边缘化,尤其是在外设产品的选择上,以前属于女性消费群体的外设产品为数不多,几乎很难找到真正意义上为假期总有勇士不愿早起?!可能你缺一个炸裂的起床方式手机定闹钟五个起步仍有勇士不愿早起!有没有觉得假期起床是一件超级可怕的事情正所谓手机配床地久天长等等可能你需要一个炸裂的起床方式至尊版Python叫醒服务!!!首先看一下Pytho可联动华为智能家居的智能锁指纹锁选购指南随着家里的智能家居产品越来越多,除了每个智能产品本身的性能,我本人会越来越注重智能产品的生态圈。良好的智能产品生态圈,可以不但可以用一个APP控制多个设备,而且各个智能产品之间还可秋季买买买,给我带来满满幸福感的家居好物,亲测买了不后悔每当换季,就是买买买剁手的时候了,什么9。9大促就如火如荼,这氛围,不剁手都对不起自己。那么我们如何从浩如烟海的商品中,选出后悔没早买的呢?我现在就分享给大家,并且这些都是我亲身验秦淮河半程马拉松母亲节温情起跑,各地爱好者齐聚共度美好一天值第108个母亲节到来之际,有一群人,在南京的母亲河秦淮河畔,用一种特殊的方式,表达了对母亲的感激与热爱。今天上午7点,来自全国各地的马拉松运动爱好者近500人,齐聚江宁区小龙湾网激发金融创造力,共筑数字新经济江苏联通金融共创大会圆满召开2021年5月28日,江苏联通金融共创大会年在南京顺利举行。本次大会以激发金融创造力,共筑数字新经济为主题,邀请到了来自江苏逾百家金融行业合作伙伴参会。江苏联通副总经理施巍巍进行开锻造硬核力量领跑智能制造宁波移动激发数字经济新动能数字经济时代,以5G数据中心工业互联网为代表的新基建风起云涌,推动实体经济加速数字化转型发展。随着浙江数字化改革如火如荼地推进,越来越多的企业加入数字化转型的浪潮中,数字经济核心产中国移动亮相2021世界数字经济大会数改先锋号成热门打卡点10月15日,以数字驱动智能发展为主题的2021世界数字经济大会暨第十一届智慧城市与智能经济博览会在浙江宁波开幕。作为主办方和参展商之一,中国移动建设510平方米展馆,以数智宁波,首届全球华人盛典落幕,悟空中文携数万海外家庭共度文化中秋9月19日,中秋佳节之际,海外少儿在线中文教育领导品牌悟空中文举办了一场主题为一句中文,便是团圆的全球华人中秋盛典直播活动,旨在推动中文教育及中华文化在海外的传承与发展,跨越地域与超级SIM卡橙小宝,乘坐公交地铁更加便利近年来,国内的移动出行方式发生了很多变化。只要刷手机就可以坐地铁公交共享单车手机让人们的生活变得更加智能方便。在如今的无现金社会,无所不能的智能手机在0电量的情况下,难倒真的成了死音箱界的特斯拉?这款美国新品不受摆位限制,真正坐拥皇帝级声效在音响界里,美国声地位显著,无论是燕飞利仕西湖还是杰士JBL,每一个烧友都印记颇深。这一场氤氲了百年的老牌音响中,却也杀出了拥有30年历程的狄分尼提,在古董般存在的厂商中就如同美国