python 常用日期处理-- datetime 模块的使用


Posted in Python onSeptember 02, 2020

仅以此篇记录一下个人常用的 Python 处理日期的库与函数,主要涉及的类库有 Python 自带的 datetime, time 和 calendar,以及第三方的 dateutil。说到日期处理基本上要覆盖的概念有 date, time, datetime, timezone, calendar, 时间的比较与差值,解析与格式化显示等。

在 datetime 模块中类之间的继承关系如下:

object
├── date
│ └── datetime
├── time
├── timedelta
└── tzinfo
└── timezone

我们着重体验一下前面粗体显示的 datetime, date, time, timedelta 对象, timezone 也不是不重要,有时候也可能只需要处理本地时间。

datetime, date, time 实例的创建

可以使用它们各自的构造函数,提供必要的参数来创建相应的实例,下面是它们的构造函数

datetime:
 def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0,
  microsecond=0, tzinfo=None, *, fold=0)
date:
 def __new__(cls, year, month=None, day=None)
 
time:
 def __new__(cls, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

比如

from datetime import datetime, date, time, timedelta
 
today = date(2019, 4, 24) # 2019-04-24

获得当前日期或时间

date.today() #2019-04-24
datetime.now() # 2019-04-24 21:41:40.226300
 
datetime.today() # 2019-04-24 21:41:50.336293
datetime.today().date() #2019-04-24
datetime.today().time() #21:41:50.336303
 
datetime.now().date()
datetime.now().time()

从语义上应该调用 date.today() datetime.now()datetime.today() 只是 datetime 继承自 date 的函数。

time 没有 today() now() 方法,所以只有通过 datetime.now() 来得到相应的 time, datetime 兼具 date 与 time 信息,所以总是可以经由 datetime 来获得相应的 date 和 time。

解析字符串获得实例

date.fromisoformat('2019-04-24')  # 2019-04-24
datetime.fromisoformat('2019-04-24T13:12:23') # 2019-04-24 13:12:23
datetime.strptime('04/24/2019', '%m/%d/%Y') # 2019-04-24 00:00:00
time.fromisoformat('12:12:24+06:00')  #12:12:24+06:00

datetime, date 和 time 都有 fromisoformat() 方法,就是要了解它们各自的 ISO 表示格式。能指定格式来解析字符串只有 datetime 有 strptime() 方法,因为有了 datetime 也就有了相应的 date 与 time

date, datetime 与 time 相应的 ISO 格式如下

  1. date ISO format: YYYY-MM-DD
  2. datetime ISO format: YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
  3. time ISO format: HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]

能自由解析字符串的就是 datetime.strptime(str, fmt),Python 借鉴了标准 C 的日期格式定义字符串,见 strftime() and strptime() Behavior. 后面的 strftime() 函数也要用到相同的格式定义法。

注:strftime() 和 strptime() 中的 f 和 p 分别对应着 format 和 parse 的首字母。

基于 Timestamp 来创建实例

Python 本身没有 Timestamp 这么一个类型,这里的 timestamp 是一个浮点数表示的

ts = datetime.today().timestamp() # 1556161777.38553
date.fromtimestamp(ts)  # 2019-04-24
datetime.fromtimestamp(ts)  # 2019-04-24 22:09:37.385530

time 没有 fromtimestamp() 方法

格式化输出

date, datetime 和 time 都有 isoformat() 和 strftime(fmt) 函数,格式字符串请参考 strftime() and strptime() Behavior。

date.today().strftime('%a %b %d, %Y') # Wed Apr 24, 2019
datetime.today().isoformat()  # 2019-04-24T22:21:38.747318
datetime.today().time().strftime('%Y') # 1900
date.today().strftime('%S')  # 00

上面是几个例子,注意在 Python 中像 time 没有年月日信息时格式化时想要输出年份会得到不期望的值,但不会象 Java 中那样报错。比如下面的 Java 代码

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate.now().format(formatter); //2019-04-24
LocalTime.now().format(formatter); //Exception java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra

由于 LocalTime.now() 没有年月日信息,所以无法格式化为 yyyy-MM-dd

时间, 日期的比较与 timedelta

  1. date, datetime, time 都定义有 __lt__, __le__, __ne__, __gt__, __ge__, __eq__ 函数,所以两个相同类型的实例之间是可以进行比较时间上的先后的。
  2. 其中的 date, datetime 还定义了 __sub__ 和 __rsub__ 函数,因此两个 date 或两个 datetime 实例进行相减会得到一个 timedelta 实例
  3. 另外, date, datetime 也定义了 __add__, __radd__ 函数,date 或 datetime 可以加减一个 timedelta 来得到一个新的实例

下面看几个简单的示例

d1 = datetime.today()    # 2019-04-24 23:00:31.672769
delta = timedelta(days=2, weeks=1, seconds=-3) # 8 days, 23:59:57
d2 = d1 + delta     # 2019-05-03 23:00:28.672769
d3 = d1 - delta     # 2019-04-15 23:00:34.672769
 
d2 - d1      # 8 days, 23:59:57
d2 > d1      # True
d1 < d3      # False
 
datetime.today().date() + delta)  # 2019-05-02

注意,不同类型间不能相减,比如用 date 减去一个 datetime 就不合法了。d1 + delta, d1 - delta 和 delta + d1 都没问题, 但是 delta - d1 就不行了。

timedelta 表示了两个时间的差值,用它来推算另一个实例的时候不带有日历信息,如果想要在日历上推演就得借助于 calendar。

不可忽略的 time 模块

前面讲到的是 datetime 模块中的 time 类型,Python 还自带了 time 模块,由 import time 引入。它提供了一些很实用的功能

  1. time 包含了完整的如上的 datetime 信息,并不像 datetime 中的 time 不含年月日信息
  2. locatime(), strptime(), gmtime(), asctime(), mktime() 用以构造 time 实例
  3. strftime() 可用来格式化输出
  4. time.time() 得到当前的 Unix 时间戳
  5. time.sleep(sec) 用来暂停当前线程若干秒

关于 calendar 和 dateutil 的内容有后续

以上就是python 日期处理的详细内容,更多关于python 日期处理的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
Python远程视频监控程序的实例代码
May 05 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
如何在python中实现随机选择
Nov 02 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
django 多数据库及分库实现方式
Apr 01 Python
TensorFlow固化模型的实现操作
May 26 Python
Python JSON常用编解码方法代码实例
Sep 05 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 Python
详解Python中的路径问题
Sep 02 #Python
python dict如何定义
Sep 02 #Python
python基本算法之实现归并排序(Merge sort)
Sep 01 #Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 #Python
Python内置函数property()如何使用
Sep 01 #Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 #Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 #Python
You might like
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
2019/07/19 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
Python进行数据提取的方法总结
2016/08/22 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
Python读写Excel表格的方法
2021/03/02 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
大队干部竞选演讲稿
2014/04/28 职场文书
数学教研活动总结
2014/07/02 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
小学生思想品德评语
2014/12/31 职场文书
男方婚礼答谢词
2015/01/20 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python
Python实现列表拼接和去重的三种方式
2021/07/02 Python
js 实现验证码输入框示例详解
2022/09/23 Javascript