Python使用一行代码获取上个月是几月


Posted in Python onAugust 30, 2018

本文介绍的关于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 模块中各种类型之间的互相转换,看着这些箭头是不是有密集恐惧症?

Python使用一行代码获取上个月是几月

不管怎样,你终究还是要熟练这些模块和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'

Python使用一行代码获取上个月是几月

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种情况是极度困难的,内部实现也会非常复杂,作为用户使用起来必然也很混乱。

总结

以上所述是小编给大家介绍的Python使用一行代码获取上个月是几月,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
Python实现从百度API获取天气的方法
Mar 11 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
把项目从Python2.x移植到Python3.x的经验总结
Apr 20 Python
python 计算文件的md5值实例
Jan 13 Python
Python模拟登陆实现代码
Jun 14 Python
Python内置函数delattr的具体用法
Nov 23 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
Pyqt5实现英文学习词典
Jun 24 Python
实例详解Python模块decimal
Jun 26 Python
python nmap实现端口扫描器教程
May 28 Python
详解Flask开发技巧之异常处理
Jun 15 Python
Python实现的读取/更改/写入xml文件操作示例
Aug 30 #Python
python实现录音小程序
Oct 26 #Python
Python图像处理之简单画板实现方法示例
Aug 30 #Python
浅析python中numpy包中的argsort函数的使用
Aug 30 #Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 #Python
python语音识别实践之百度语音API
Aug 30 #Python
python调用百度语音识别实现大音频文件语音识别功能
Aug 30 #Python
You might like
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
php header()函数使用说明
2008/07/10 PHP
防止用户利用PHP代码DOS造成用光网络带宽
2011/03/01 PHP
PHP取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
php实现简单文件下载的方法
2015/01/30 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
Vue组件化通讯的实例代码
2017/06/23 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python下载文件时显示下载进度的方法
2015/04/02 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
EJB发布WEB服务一般步骤
2012/10/31 面试题
大学毕业的自我鉴定
2013/10/08 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
新教师个人总结
2015/02/06 职场文书
远程教育学习心得体会
2016/01/23 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
win10更新失败无限重启解决方法
2022/04/19 数码科技