返回顶部
首页 > 资讯 > 后端开发 > Python >Python:如何用一行代码获取上个月是
  • 328
分享到

Python:如何用一行代码获取上个月是

上个月如何用代码 2023-01-30 22:01:38 328人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

现在转一篇志军100发于公众号 python之禅的文章: Python:如何用一行代码获取上个月是几月   抱歉我用了个有点标题党的标题,因为担心你错过了本文,但内容绝对干货,本文介绍的关于Python时间日期处理,日期时间处理在实际应用

现在转一篇志军100发于公众号 python之禅的文章:

Python:如何用一行代码获取上个月是几月

 

抱歉我用了个有点标题党的标题,因为担心你错过了本文,但内容绝对干货,本文介绍的关于Python时间日期处理,日期时间处理在实际应用场景中无处不在,所以这也成了编程语言中必不可少的模块,Python 也不例外。但是,你知道在Python中有多少个相关的模块吗?datetime、time、calendar、 dateutil、 pytz 等等。 你知道有多少种数据类型吗?date、time、datetime、tzinfo、timedelta 等等。

有天我遇到这样的需求,想获取当前月的前一个月是几月,假设本月是2018年1月,那么上个月就是2017年12月,大约要经过这么几个步骤

 >>> import datetime
# 1. 获取「今天」
>>> today = datetime.date.today()
# 2. 获取当前月的第一天
>>> first = today.replace(day=1)
# 3. 减一天,得到上个月的最后一天
>>> last_month = first - datetime.timedelta(days=1)
# 4. 格式化成指定形式
>>> print(last_month.strftime("%Y%m"))
201807
>>>

这是有多麻烦? 麻烦得你怀疑这是 Python 代码? 可能有人会说,用 datetime.replace 方法将 month-1 就好了,咋看起来没问题,实际上这是有 bug 的,month 的范围只能是 1-12

>>> d.replace(month=d.month-1)
datetime.datetime(2018, 7, 24, 11, 29, 28, 929830)

month-11 就报错了

>>> d.replace(month=d.month-11)
ValueError: month must be in 1..12

你还知道日期时间、时间戳、字符串之间的互相转换的那些 api 方法吗?是不是每次处理时间相关的操作时,总要去官方文档翻看一遍才能动手。你可以看看 time 模块和 datetime 模块中各种类型之间的互相转换,看着这些箭头是不是有密集恐惧症?

 

不管怎样,你终究还是要熟练这些模块和API操作的,记不住没关系,至少你都要手动敲几遍,下次遇到时要能做到翻看文档能快速定位到某个类某个方法是做什么用、怎么用。

但今天我要强烈安利给你的这个时间日期库:Arrow。它的灵感来自于 requests 库。将所有繁杂的东西全部隐藏于身后,留给你的是 for humans 接口。充分诠释了 keep it simple and stupid 这句话的含义。

这篇文章带你初步了解并掌握 Arrow 的使用方式。

安装

$ pip install arrow

使用

>>> a = arrow.now() # 当前本地时间
>>> a
<Arrow [2018-08-24T07:09:03.468562+08:00]>

>>> arrow.utcnow() # 当前utc时间
<Arrow [2018-08-23T23:11:50.147585+00:00]>

你可以认为 Arrow 对象是一个增强版的 datetime 对象

通过 Arrow 对象你可以获取 datetime 对象

>>> t = a.datetime
>>> type(t)
<class 'datetime.datetime'>
>>> t
datetime.datetime(2018, 8, 24, 7, 17, 14, 884750, tzinfo=tzlocal())

通过 Arrow 对象你可以得到时间戳

>>> a.timestamp
1535066234

获取 arrow 对象的年、月、日、时、分、秒

>>> a.year
2018
>>> a.month
8
>>> a.day
24
>>> a.hour
7

获取 arrow 对象的时间和日期

>>> a.date()
datetime.date(2018, 8, 24)
>>> a.time()
datetime.time(7, 9, 3, 468562)

注意,获取时间和日期是用方法,而获取 datetime 和 timestamp 是两个属性

接下来介绍一些 arrow 有意思的方法

shift

shift 有点像游标卡尺,可以左右两边进行加减移位操作,加减的对象可以是年月日时分秒和星期。再回到文章开始地方,想获取当前月的前一个月,你可以这样写:

>>> a.shift(months=-1)
<Arrow [2018-07-24T07:09:03.468562+08:00]>

>>> a.shift(months=-1).fORMat("YYYYMM")
'201807'
>>>

指定参数 months = -1 就可以了。往后一个月就是 month=+1, 加号可以省略。这样你可以基于一个 arrow 时间对象进行任意的往前加或者往后减。 注意 month 后面有个s, year 同理。 以下是一些例子。

加一个月

>>> a.shift(months=1)
<Arrow [2018-09-24T07:09:03.468562+08:00]>

减一个月

>>> a.shift(months=-1)
<Arrow [2018-07-24T07:09:03.468562+08:00]>

减两年

>>> a.shift(years=-2)
<Arrow [2016-08-24T07:09:03.468562+08:00]>
>>>

加一个小时

>>> a.shift(hours=1)
<Arrow [2018-08-24T08:09:03.468562+08:00]>

还可以按周进行加减

>>> a.shift(weeks=1)
<Arrow [2018-08-31T07:09:03.468562+08:00]>

如果你要明确指定修改成哪年或者哪月,那么使用 replace 方法即可,repalce 在 datetime 对象中也有该方法,两者的使用方式是一样的。

humanize

humanize 方法是相对于当前时刻表示为“多久以前”的一种可读行字符串形式,默认是英文格式,指定 locale 可显示相应的语言格式。

>>> a.humanize()
'6 hours aGo'
>>> a.humanize(locale='zh')
'6小时前'

format

format 是格式化工具,可以根据指定的格式将 arrow 对象转换成字符串格式,格式Token请参考下图

>>> a.format()
'2018-08-24 07:09:03+08:00'
>>> a.format("YYYY-MM-DD HH:mm:ss")
'2018-08-24 07:09:03'

to

to 可以将一个本地时区转换成其它任意时区,例如:

>>> arrow.now()
<Arrow [2018-08-24T16:58:50.990657+08:00]>
>>> arrow.now().to("utc")
<Arrow [2018-08-24T08:59:04.316289+00:00]>
>>> arrow.now().to("utc").to("local")
<Arrow [2018-08-24T16:59:15.800847+08:00]>
>>> arrow.now().to("America/New_York")
<Arrow [2018-08-24T04:59:34.037182-04:00]>

构建 Arrow 对象

前面介绍了 arrow 可以转换成datetime、str、date、time、timestamp,那么如何构建 Arrow 对象呢?除了使用 now()、utcnow() 方法之后,你还可以使用 get 工厂方法,或者使用 Arrow 构造方法直接指定年月日时分秒

>>> arrow.Arrow(2018, 8, 24, 12, 30, 45)
<Arrow [2018-08-24T12:30:45+00:00]>
>>> arrow.Arrow(2018, 8, 24, 12, 30, 45, tzinfo='utc')
<Arrow [2018-08-24T12:30:45+00:00]>
>>> arrow.Arrow(2018, 8, 24, 12, 30, 45, tzinfo='local')
<Arrow [2018-08-24T12:30:45+08:00]>

get

第二种方式是用get方法来创建 arrow 对象,get 方法”非常灵活”,直接看例子,跟着敲

# 不带参数,等价与 utcnow()
>>> arrow.get()
<Arrow [2018-08-24T07:11:50.528742+00:00]>

# 接受时间戳参数
>>> arrow.get(1535113845)

# 接受一个datetime对象
>>> arrow.get(datetime(2018,8,24))
<Arrow [2018-08-24T00:00:00+00:00]>

# 接收一个date对象
>>> from datetime import date
>>> arrow.get(date(2018,7,24))
<Arrow [2018-07-24T00:00:00+00:00]>

# 接收日期格式的字符串
>>> arrow.get("2018-08-11 12:30:56")
<Arrow [2018-08-11T12:30:56+00:00]>

# 接收日期字符串,并指定格式
>>> arrow.get("18-08-11 12:30:56", "YY-MM-DD HH:mm:ss")
<Arrow [2018-08-11T12:30:56+00:00]>

Arrow 的不足

关于 get 方法,看似强大,使用起来灵活,感觉什么参数都能接受,但是也带来了一些问题,甚至是 bug。比如

>>> arrow.get("2018-7-11")
<Arrow [2018-01-01T00:00:00+00:00]>

期望的值应该是 2018-07-11, 但是它并没有提示错误,而正确的做法是要指定格式,因为你传的字符串不是标准的日期格式。

>>> arrow.get("2018-7-11", "YYYY-M-DD")
<Arrow [2018-07-11T00:00:00+00:00]>

想通过一个方法来兼容n种情况是极度困难的,内部实现也会非常复杂,作为用户使用起来必然也很混乱。

 

--结束END--

本文标题: Python:如何用一行代码获取上个月是

本文链接: https://lsjlt.com/news/179221.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python:如何用一行代码获取上个月是
    现在转一篇志军100发于公众号 Python之禅的文章: Python:如何用一行代码获取上个月是几月   抱歉我用了个有点标题党的标题,因为担心你错过了本文,但内容绝对干货,本文介绍的关于Python时间日期处理,日期时间处理在实际应用...
    99+
    2023-01-30
    上个月 如何用 代码
  • shell下如何获取上一个月
    这篇文章主要介绍了shell下如何获取上一个月,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如下所示:#!/bin/bash#一月前historyTime=$(date&nb...
    99+
    2023-06-09
  • 如何在MySQL中获取上个月的最后一天?
    借助以下 MySQL 查询,我们可以获得上个月的最后一天 -mysql> SELECT LAST_DAY(now() - INTERVAL 1 MONTH) AS 'LAST DAY OF PREVIOUS MONTH'...
    99+
    2023-10-22
  • 如何从Github上获取代码并运行
    随着开源文化的兴起,越来越多的程序被托管在Github上,对于一些对编程有兴趣或者需要使用这些程序的人来说,学会如何在Github上运行程序是非常必要的一项技能。下面我们将介绍如何跑Github上的程序。一、什么是Github?Github...
    99+
    2023-10-22
  • 代码行号如何利用Java获取
    这篇文章将为大家详细讲解有关代码行号如何利用Java获取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体实现代码:package leo.demo.training;public clas...
    99+
    2023-05-31
    java ava
  • php如何获取当前是第几个月
    这篇文章主要介绍了php如何获取当前是第几个月,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在PHP中,可以利用date()函数获取当前是第几个月,该函数用于格式化时间和日期...
    99+
    2023-06-29
  • 如何在MySQL中获取下个月的第一天?
    借助以下 MySQL 查询,我们可以获得下个月的第一天 -mysql> SELECT DATE_FORMAT(CURDATE() + INTERVAL 1 MONTH,'%Y-%m-01') AS 'FIRST...
    99+
    2023-10-22
  • Java获取上月份最后一天日期8位的示例代码
    先给大家介绍下Java获取上月份最后一天日期8位。 代码如下所示: private String getBeforeLastMonthdate()throws Excep...
    99+
    2024-04-02
  • Python如何17行代码画一个爱心
    🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0&...
    99+
    2023-10-18
    python 开发语言 笔记 经验分享 virtualenv
  • 如何在MySQL中获取下个月的最后一天?
    借助以下 MySQL 查询,我们可以获得下个月的最后一天 -mysql> SELECT LAST_DAY(now() + INTERVAL 1 MONTH) AS 'LAST DAY OF NEXT MONTH'; +...
    99+
    2023-10-22
  • 如何使用尽可能短的代码行数来获取任意月份的天数?
    ...
    99+
    2024-04-02
  • 使用shell脚本怎么获取上个月最后一天的日期
    今天就跟大家聊聊有关使用shell脚本怎么获取上个月最后一天的日期,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。linux中用date命令来获取上个月最后一天的日期:$ d...
    99+
    2023-06-09
  • 用pycharm怎么运行一个python代码
    在 pycharm 中运行 python 代码需要以下步骤:确保 pycharm 和 python 解释器已正确设置。打开要运行的代码文件。选择用于运行代码的运行配置。通过“运行文件”或...
    99+
    2024-04-17
    python pycharm
  • 利用python获取某年中每个月的第一天和最后一天
    搜索关键字: python get every first day of month 参考解答: 方法一: >>> import calendar >>> calen...
    99+
    2022-06-04
    天和 每个月 python
  • python-如何获取命令行是参数
    如果需要获取python test.py xx yy zz上面输入的xx yy zz python可以使用sys.argv获取到命令行参数。sys.argv[0]表示代码本身文件路径,所有参数从1开始,一下例子说明,创建一个test.py文...
    99+
    2023-01-31
    命令行 参数 python
  • Python如何获取系统iops示例代码
    iops简介 iops主要用在数据方面,这个指标是数据库性能评定的一个重要参考,iops的是每秒进行读写(I/O)操作的次数,主要看随机访问的性能,一般为了iops增高都要依靠磁盘阵列,实际线上的数据库基本...
    99+
    2022-06-04
    示例 代码 系统
  • 如何在Github上运行Python代码
    Github是全球最大的开源社区之一,为开发者们提供了非常便捷的开源代码分享、协作交流平台。很多Python程序员在Github上分享了他们的Python代码,为Python社区的发展做出了积极的贡献。但是,对于新手来说,在Github上如...
    99+
    2023-10-22
  • 如何在 Windows 上运行 Python 代码?
    Python 是一门功能强大的编程语言,可以用于各种不同的应用场景。在 Windows 操作系统上运行 Python 代码是一个非常普遍的需求。本文将介绍如何在 Windows 上安装 Python 和运行 Python 代码。 安装 Py...
    99+
    2023-11-11
    windows npm git
  • Java如何利用LocalDate获取某个月的第一天与最后一天日期
    目录问题描述:使用TemporalAdjusters方法实现使用getDayOfMonth()方法实现补充:使用LocalDateTime也可以实现相关功能java获取指定日期当月和...
    99+
    2024-04-02
  • python如何使用一行代码定义List
    这篇文章主要为大家展示了“python如何使用一行代码定义List”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何使用一行代码定义List”这篇文章吧。一行代码定义List定义某种...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作