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

 更新时间:2020年09月02日 09:45:50   作者:Yanbin  
这篇文章主要介绍了python 如何对日期进行处理,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下

仅以此篇记录一下个人常用的 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中print()函数的“,”与java中System.out.print()函数中的“+”功能详解

    python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解

    python中的print()函数和java中的System.out.print()函数都有着打印字符串的功能。接下来通过本文给大家分享python中print()函数的“,”与java中System.out.print()函数中的“+”功能,需要的朋友参考下吧
    2017-11-11
  • pytorch_detach 切断网络反传方式

    pytorch_detach 切断网络反传方式

    这篇文章主要介绍了pytorch_detach 切断网络反传方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 使用Python实现计算DICOM图像两点真实距离

    使用Python实现计算DICOM图像两点真实距离

    这篇文章主要为大家详细介绍了如何使用Python实现计算DICOM图像两点真实距离,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • Python面向对象特殊属性及方法解析

    Python面向对象特殊属性及方法解析

    这篇文章主要介绍了Python面向对象特殊属性及方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 使用Python批量对文本文件编码互转的方法

    使用Python批量对文本文件编码互转的方法

    这篇文章主要介绍了使用Python批量对文本文件编码互转的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Python之Numpy的超实用基础详细教程

    Python之Numpy的超实用基础详细教程

    这篇文章主要介绍了Python之Numpy的超实用基础详细教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Python实现网络通信的HTTP请求Socket编程Web爬虫方法探索

    Python实现网络通信的HTTP请求Socket编程Web爬虫方法探索

    随着互联网的不断发展,Python作为一门多用途的编程语言,提供了强大的工具和库来进行网络连接和通信,本文将深入探讨Python中连接网络的方法,包括HTTP请求、Socket编程、Web爬虫和REST API的使用
    2024-01-01
  • xshell会话批量迁移到mobaxterm的工具(python小工具)

    xshell会话批量迁移到mobaxterm的工具(python小工具)

    这篇文章主要介绍了xshell会话批量迁移到mobaxterm的工具,使用方法也超级简单,本文通过python代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 理解python中装饰器的作用

    理解python中装饰器的作用

    python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能
    2021-07-07
  • Python 学习教程之networkx

    Python 学习教程之networkx

    networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法。对Python networkx相关知识感兴趣的朋友跟随小编一起看看吧
    2019-04-04

最新评论