热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python获取月份天数_盘一盘Python特别篇16DateTime

本文含4064字,10图表截屏建议阅读22分钟本文是Python系列的特别篇的第十七篇特别篇1-PyEchartsTreeMap特别篇2-面向对象编程特别篇3-两大利

a08d0cde4495b36bfc6e3a410fe1245f.png

本文含 4064 字,10图表截屏建议阅读 22 分钟53a9b43e84702949eca7c1bd6433a4fa.png

本文是 Python 系列的特别篇的第十七篇

  • 特别篇 1 - PyEcharts TreeMap

  • 特别篇 2 - 面向对象编程

  • 特别篇 3 - 两大利「器」

  • 特别篇 4 - 装饰器

  • 特别篇 5 - Sklearn 0.22

  • 特别篇 6 - Jupyter Notebook

  • 特别篇 7 - 格式化字符串

  • 特别篇 8 - 正则表达式

  • 特别篇 9 - 正则表达式实战

  • 特别篇 10 - 错误类型

  • 特别篇 11 - 异常处理

  • 特别篇 12 - Collection

  • 特别篇 13 - Matplotlib Animation

  • 特别篇 14 - All 和 Any

  • 特别篇 15 - 透视表 Pivot Table

  • 特别篇 16 - 交叉表 Cross Table

  • 特别篇 17 - DateTime

0引言

在 Python 中有一个内置的专门处理“日期时间”的工具包叫做 datetime,而日期 (date) 和时间 (time) 在金融工程中的处处都用得到。

一看日期还不简单,人人都会啊有什么可学的,来来来,先看看下面几个问题。

  1. 为什么美股有时候在北京时间晚上 21:30 开市,有时候在 22:30 开市呢?

  2. 为什么两个相同的日期在不同金融产品 (债券或利率掉期) 计算出来的年限会不一样呢?

第一个问题涉及到时区 (timezone) 和夏令时 (day saving time) 的知识。

第二个问题涉及到日期计数惯例 (daycount convention) 的知识。

这些都是日期中非常细节而又很难捋清的知识点,不在本帖打好日期时间的基础怎么能进一步学习以上知识点呢?

1日期

和 Python 中其他变量类型一样,日期也可以看成是一种变量。

f6500b0323b5cb0030e6c2ec2bcbf00f.png

在没接触过 date 对象之前,日期通常写成字符串形式,如下例用字符串定义了两个现金流日,放在列表中。

cashflow_dates = ["20/3/2020", "20/6/2020"]日期对象

创建日期很简单,首先从 datetime 包中引入 date 对象。

from datetime import date

用 date() 加上年、月、日三个参数即可定义日期。

cashflow_dates = [ date(2020, 3, 20), date(2020, 6, 20) ]cashflow_dates

[ datetime.date(2020, 3, 20),
  datetime.date(2020, 6, 20) ]

Python 中万物皆对象,查看对象里的字段和方法 (属性) 用 dir()。

print(dir(cashflow_dates[0]))

ca83e0e0f78f26463ec090aeb8314b7b.png

对于日期,用字段 .year, .month 和 .day 可获取年、月、日信息,用方法 weekday() 可获取星期几的信息。

print(cashflow_dates[1].year)print(cashflow_dates[1].month)print(cashflow_dates[1].day)print(cashflow_dates[1].weekday())

2020
6
20
5

在 Python 中,星期几和数字的对应关系如下:

  • 0: 星期一 (Monday)

  • 1: 星期二 (Tuesday)

  • 2: 星期三 (Wednesday)

  • 3: 星期四 (Thursday)

  • 4: 星期五 (Friday)

  • 5: 星期六 (Saturday)

  • 6: 星期日 (Sunday)

而 2020 年 6 月 20 日是星期五,对应的数字是 5。

日期运算

日期也可以做一些算术和比较运算,操作的时候把它当作一个数值。

e588481aa67dd276908b062a0738123d.png

d1 = date(2020, 3, 20)d2 = date(2020, 6, 20)

我们可以比较两个日期谁前谁后

d1

True

也可以计算它们之间的“距离”,差多少天或者多少秒。

print(d2 - d1)

92 days, 0:00:00

两个日期对象相减得到的是一个 timedelta 对象,

type(d2 - d1)

datetime.timedelta

看着 timedelta 顾名思义写成数学符号就是 Δt,如果将日期用符号 t 表示,那么 Δt 不就代表日期差吗?用 .days 字段查看具体的天数差。

(d2 - d1).days

92

日期 d2 减去日期 d1 得到 timedelta,那么把 timedelta 加回 d1 应该得到 d2。

df795a50e0cb2fc1e736cade9b588d9e.png

首先从 datetime 包中引入 timedelta 对象。

from datetime import timedelta

从上面结果可知 d1 和 d2 相差 92 天,用 timedelta() 对象并设定 days=92 来定义 td,加回 d1 得到 d2。

td = timedelta(days=92)print(d1 + td)

2020-06-20日期格式

日期的格式有很多种,在展示中如果不确定用哪种格式,建议用标准格式 .isoformat()。

d = date(2014, 1, 11)print( type(d), d )

2014-01-11

如果需要特定格式,那么用 strftime(),从其函数名 str-f-time 就可以猜到它是用一个字符串 (are) 来代表时间 (time) 的格式 (f)。

print( d.isoformat() )

2014-01-11

调整日期格式可去 https://strftime.org/ 查看详细信息,比如

  • %Y - 年的全称 (如 2020)

  • %m - 月份的数字形式 (个位数用零填充, 比如 1 填充成 01)

  • %b - 月份的简称 (如 Mar)

  • %d - 天数 (个位数用零填充)

  • %a - 日期的简称 (Wed)

还原 ISO 格式。

print( d.strftime('%Y-%m-%d') )

2014-01-11

自定义格式。

print( d.strftime('%b %d, %Y (%a)') )

Jan 11, 2014 (Sat)2日期时间

年、月、日可以组成日期,时、分、秒可以组成时间。日期加上时间才是完整的信息。Python 里对日期时间定义的更细,还带微秒时区

7b3c1099d9675222633208f37af1efa2.png

时间对象

和上面 date 对象相对应的是 time 对象,还是从 datetime 包里引入。

from datetime import time

回想上面

        date(year, month, day)

类比

        time(hour, minute ,second)

来创建时间。

t = time(8, 32, 21)print( type(t), t )

08:32:21日期时间对象

但单单一个时间对象没什么还实用价值,一般是联合日期定义一个日期时间 datetime 对象。

datetime 对象里的参数包括年、月、日、时、分、秒、微秒和时区。微秒在高频交易才用得到,时区在下贴细讲。

    datetime( year, month, day,

              hour, minute, second,

              macrosecond, tzinfo )

代码如下:

dt = datetime(2014, 1, 11, 8, 32, 21, 1031)print( type(dt), dt )

2014-01-11 08:32:21.001031

可在 replace() 函数设置年、月、日、时、分、秒、微秒来重设时间。记着重设完要做赋值动作,因为 replace 不是一个原地 (in-place) 动作。

dt_hr = dt.replace(minute=0, second=0, microsecond=0)print(dt_hr)日期时间之差

上节已介绍过两个日期对象相减得到一个 timedelta 对象,延伸一下,两个日期时间对象相减得到也是一个 timedelta 对象。

bb08769a4fc46873182832e15e4dabc3.png

用 datetime 对象来创建女儿和儿子 (姐弟俩) 的生日 (精确到秒)。

daughter_bday = datetime(2014, 1, 11, 8, 32, 21)son_bday = datetime(2018, 12, 2, 21, 58, 52)

计算他们生日相隔的 timedelta 对象。

duration = son_bday - daughter_bdaytype(duration)

datetime.timedelta

姐弟俩相隔 1500000 多秒,1786 天,4.89 年。

print(duration.total_seconds())print(duration.days)print(duration.total_seconds()/(3600*24*365))

154358791.0
1786
4.894685153475393

在弟弟生日上加一秒,用 timedelta 对象并设置 seconds=1。

delta1 = timedelta(seconds=1)print(son_bday)print(son_bday+delta1)

2018-12-02 21:58:52
2018-12-02 21:58:53

在弟弟生日上加一小时一秒,用 timedelta 对象并设置 hours=2, seconds=1。

delta2 = timedelta(hours=2, seconds=1)print(son_bday)print(son_bday+delta2)

2018-12-02 21:58:52
2018-12-02 23:58:53

用 timedelta 对象不仅可以加在日期得到未来的时间,还可以将里面的参数定义复制得到过去的时间。

delta3 = timedelta(weeks=-1)print(son_bday+delta3)print(son_bday)print(son_bday-delta3)

2018-11-25 21:58:52
2018-12-02 21:58:52
2018-12-09 21:58:52
3总结

Python 中有日期对象 date,时间对象 time,和日期时间对象 datetime。

本帖讲的东西很基础,但它们都是为了理解之后的时区 (timezone)、 夏令时 (day saving time) 和日期计数惯例 (daycount convention) 这些难点。

哦,对了,如果你想知道当前的日期时间,用 .now() 或者 .today()。

print( datetime.now() )print( datetime.today() )

2020-06-23 15:17:40.522769
2020-06-23 15:17:40.522769

Stay Tuned!

62b022108c77730b336ba0463ed1baa2.png

88bd68e3874c14421bf505e6b0c12b3a.png




推荐阅读
  • Python15行代码实现免费发送手机短信,推送消息「建议收藏」
    Python15行代码实现免费发 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
  • 文章目录题目:二叉搜索树中的两个节点被错误地交换。基本思想1:中序遍历题目:二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • 原文链接:Python:获取“3年前的今天”的日期时间Python:getdatetimefor3yearsagotoday在Python中,如何获取3年前的今天的datetime ... [详细]
  • https:github.comdarcyclarkeFront-end-Developer-Interview-QuestionstreemasterChinese#refere ... [详细]
  • 由于同源策略的限制,满足同源的脚本才可以获取资源。虽然这样有助于保障网络安全,但另一方面也限制了资源的使用。那么如何实现跨域呢,以下是实现跨域的一些方法。 ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • Abp+MongoDb改造默认的审计日志存储位置
    一、背景在实际项目的开发当中,使用AbpZero自带的审计日志功能写入效率比较低。其次审计日志数据量中后期十分庞大,不适合与业务数据存放在一起。所以我们可以重新实现A ... [详细]
  • Python——Pandas 时间序列数据处理
    介绍Pandas是非常著名的开源数据处理库,我们可以通过它完成对数据集进行快速读取、转换、过滤、分析等一系列操作。同样,Pandas已经被证明为是非常强大的用于处理时间序列数据的工 ... [详细]
author-avatar
I技男
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有