- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python 日期的转换及计算的具体使用详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
日期的转换及计算 。
对于日期,有时需执行不同时间单位的转换,或者接受字符串格式的日期,转换为 datetime 对象。有时需计算日期的范围,以及特定某个星期几的日期。这里更多用到的是 Python 提供的 datetime 模块.
datetime 模块 。
日期与时间的简单转换 。
datetime 模块中可以通过创建 timedelta 对象表示一个时间段。如下示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>>
from
datetime
import
timedelta
>>> a
=
timedelta(days
=
2
, hours
=
6
)
>>> b
=
timedelta(hours
=
4.5
)
>>> c
=
a
+
b
>>> c
datetime.timedelta(
2
,
37800
)
>>> c.days
2
>>> c.seconds
37800
>>> c.seconds
/
3600
10.5
>>> c.total_seconds()
/
3600
58.5
|
如果想表示指定的日期和时间,需要先创建 datetime 对象然后使用标准数学运算执行操作。示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
>>>
from
datetime
import
datetime
>>> a
=
datetime(
2020
,
1
,
15
)
>>>
print
(a
+
timedelta(days
=
10
))
2020
-
01
-
25
00
:
00
:
00
>>> b
=
datetime(
2020
,
2
,
3
)
>>> d
=
b
-
a
>>> d
datetime.timedelta(
19
)
>>> d.days
19
>>> now
=
datetime.today()
>>>
print
(now)
2020
-
01
-
15
10
:
59
:
10.230995
>>>
print
(now
+
timedelta(minutes
=
10
))
2020
-
01
-
15
11
:
09
:
10.230995
|
datetime 对象能够自行处理闰年的问题,如下示例:
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> a
=
datetime(
2020
,
3
,
1
)
>>> b
=
datetime(
2020
,
2
,
28
)
>>> a
-
b
datetime.timedelta(
2
)
>>> (a
-
b).days
2
>>> c
=
datetime(
2019
,
3
,
1
)
>>> d
=
datetime(
2019
,
2
,
28
)
>>> c
-
d
datetime.timedelta(
1
)
>>> (c
-
d).days
1
|
字符串与日期的转换 。
当编写的程序接受以字符串格式表达的日期输入时,需求为将此类字符串转换为 datetime 对象进行计算.
使用 datetime 对象中的 strptime() 方法实现,如下代码:
1
2
3
4
5
6
7
8
9
10
11
|
>>>
from
datetime
import
datetime
>>> text
=
'2020-01-15'
>>> y
=
datetime.strptime(text,
'%Y-%m-%d'
)
>>> y
datetime.datetime(
2020
,
1
,
15
,
0
,
0
)
>>> z
=
datetime.now()
>>> z
datetime.datetime(
2020
,
1
,
15
,
11
,
10
,
11
,
71792
)
>>> diff
=
z
-
y
>>> diff
datetime.timedelta(
0
,
40211
,
71792
)
|
上述 %Y 的含义是以十进制表示的带世纪的年份,%m 为以补零后的十进制表示的月份,%d 为以补零后的十进制表示月份中的一天.
以下是几项格式代码。例如:
。
指令 。 |
含义 。 |
---|---|
%a 。 |
当地工作日的缩写 。 |
% A 。 |
当地工作日的全名 。 |
% b 。 |
当地月份的缩写 。 |
% B 。 |
当地月份的全名 。 |
% H 。 |
补零后十进制表示的小时(24小时制) 。 |
% I 。 |
补零后十进制表示的小时(12小时制) 。 |
% M 。 |
补零后十进制表示的分钟 。 |
% S 。 |
补零后十进制表示的秒 。 |
。
将日期格式化为英文易读形式,如下:
1
2
3
4
5
|
>>> z
datetime.datetime(
2020
,
1
,
15
,
11
,
10
,
11
,
71792
)
>>> format_z
=
datetime.strftime(z,
"%A %B %d, %Y"
)
>>> format_z
'Wednesday January 15, 2020'
|
datetime.strftime() 函数返回一个由显示格式字符串所指定的代表日期的字符串。格式指令,如上述代码中的 "%A %B %d, %Y"。其中该函数的第一个参数为 datetime 对象.
这里需要注意的地方是,strptime 的性能比较差。若明确需求是解析大量并且已经知道格式的日期字符串,可以考虑自己实现一套解析方案。假设格式如 YYYY-MM-DD,可用如下代码实现解析函数:
1
2
3
4
|
from
datetime
import
datetime
def
parse_ymd(s):
year_s, mon_s, day_s
=
s.split(
'-'
)
return
datetime(
int
(year_s),
int
(mon_s),
int
(day_s))
|
两者实现的效果:
1
2
3
4
5
6
7
8
9
10
11
12
|
In [
1
]:
from
datetime
import
datetime
...:
def
parse_ymd(s):
...: year_s, mon_s, day_s
=
s.split(
'-'
)
...:
return
datetime(
int
(year_s),
int
(mon_s),
int
(day_s))
In [
2
]: text
=
"2020-01-15"
In [
3
]:
%
timeit datetime.strptime(text,
'%Y-%m-%d'
)
7.75
µs ±
31
ns per loop (mean ± std. dev. of
7
runs,
100000
loops each)
In [
4
]:
%
timeit parse_ymd(text)
1.05
µs ±
3.07
ns per loop (mean ± std. dev. of
7
runs,
1000000
loops each)
|
可以看出,parse_ymd() 函数比 datetime.strptime() 快 7 倍多。若是进行大量处理的设计日期,且格式固定的情况下,可以考虑这个方案.
计算某个月份的日期范围 。
Python 提供的 calendar 模块提供了与日历相关的函数。可以考虑配合 datetime 模块实现需求:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
@File: datetime_calendar.py
@Time: 2020/01/15 12:46:58
@Author: 大梦三千秋
@Contact: yiluolion@126.com
'''
# put the import lib here
from
datetime
import
date, timedelta
import
calendar
def
get_month_range(start_date
=
None
):
'''获取月份的范围
Args:
start_date: 开始的日期,默认为 None
Returns:
返回包含月份开始日期和结束日期的元组
'''
if
start_date
is
None
:
# 若 start_date 为空,赋值为当月的第一天
start_date
=
date.today().replace(day
=
1
)
# 获取月份的天数
_, days_in_month
=
calendar.monthrange(start_date.year, start_date.month)
# 计算结束日期
end_date
=
start_date
+
timedelta(days
=
days_in_month)
# 返回开始日期和结束日期的元组
return
(start_date, end_date)
|
在交互式解释器中使用如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
In [
1
]:
from
datetime
import
timedelta
In [
2
]:
from
datetime_calendar
import
get_month_range
In [
3
]: a_day
=
timedelta(days
=
1
)
In [
4
]: first_day, last_day
=
get_month_range()
In [
5
]:
while
first_day < last_day:
...:
print
(first_day)
...: first_day
+
=
a_day
...:
2020
-
01
-
01
2020
-
01
-
02
2020
-
01
-
03
2020
-
01
-
04
2020
-
01
-
05
2020
-
01
-
06
2020
-
01
-
07
2020
-
01
-
08
...
|
注意:若在交互解释器下无法导入自己写的模块中的方法,尝试直接在文件所在的路径下打开交互解释器。 上面的代码中,首先将 start_date 对应月份的第一天的日期计算出来。这里使用了 date 对象的 replace() 方法将 day 属性设置为 1,即表示第一天.
calendar.monthrange() 函数返回指定年份指定月份第一天是星期几,以及这个月的天数.
获得月份天数后,加上开始日期可得结束日期。这里需要注意的是,结束日期并不包含在这个日期范围。在遍历的时候,判断条件为 first_day < last_day,不输出 last_day 的值,以 timedelta 实例进行递增日期.
参考资料 。
来源 。
David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O'Reilly Media.2013. 。
"8.1. datetime — Basic date and time types".docs.python.org.Retrieved 11 January 2020 。
"8.2. calendar — General calendar-related functions".docs.python.org.Retrieved 13 January 2020 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://segmentfault.com/a/1190000021592489 。
最后此篇关于Python 日期的转换及计算的具体使用详解的文章就讲到这里了,如果你想了解更多关于Python 日期的转换及计算的具体使用详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的数据库中有两张表,一张用于 field ,另一张用于预订。我需要的是一个查询来选择所有未预订的 field 。见下文: 餐 table 预订具有以下字段: bk_id venue_id 作为(预订
嗨,我是编码新手,我有一些培训项目,其中包括从 HTML 表单输入 MySQL 数据库。它就像你玩过的游戏的日志。第一个日期输入是您开始游戏的时间,第二个日期输入是您完成游戏的时间。但我需要检查器或类
我是这个 sql 编码的新手,我正在尝试学习新的东西。因此,我创建了一个交货表,其中包含一些属性,如商品代码、交货日期、交货数量。所以如何从同一张表中获取第一个交货日期(最小日期)和交货数量以及最晚交
我从支付网关返回了这个日期 2014-05-15T08:40:52+01:00 我得到 2014-05-15T08:40:52 但我无法识别时区 +01:00 的含义 我的位置时区是 UTC−06:0
我快要疯了,请帮忙。 我有一列包含日期时间值。 我需要找到每天的最小值和最大值。 数据看起来像这样 2012-11-23 05:49:26.000 2012-11-23 07:55:43.000
我从 json 数据中获取日期为 2015 年 4 月 15 日晚上 10:15我只想在 html 页面中显示 json 响应数据的时间,例如 10:15 PM这里我放了我的js函数和html代码 J
是否有 javascript 库或其他机制允许我将 .NET 日期/时间格式字符串(即 yyyy-MM-dd HH:mm:ss)传递给 javascript函数并让它相应地解析提供的日期时间值?我一直
我正在使用以下代码以正确的格式获取当前的 UTC 时间,但客户返回并要求时间戳现在使用 EST 而不是 UTC。我搜索了 Google 和 stackoverflow,但找不到适用于我现有代码的答案。
我有以下日期的平均温度数据。我想找到连续至少 5 天低于或高于 0 摄氏度的开始日期。 date_short mean.temp 1 2018-05-18 17.54 2 2018-05-19
它可以在其他网络浏览器中使用,但 IE11 返回无效日期。 为了调试我使用了下面的代码。 console.log('before - ' + date.value); date.value = new
我在 Excel 中有一个数据的 Web 提取,其中日期列带有/Date(1388624400000)/。我需要在 Excel 中将其转换为日期。 最佳答案 能够从 here 中推断出它. 假设字符串
嗨,我的 Schmema 有一个带有 ISO 日期的字段: ISODate("2015-04-30T14:47:46.501Z") Paypal 在成功付款后以该形式返回日期对象: Time/Date
我的 table : CREATE TABLE `tbdata` ( `ID` INT(10) NOT NULL AUTO_INCREMENT, `PatientID` INT(10) NOT
我正在 Ubuntu 服务器 12.04 中编写一个 shell 脚本,它应该比较日志文件中的一些数据。在日志文件中,日期以以下格式给出: [Mon Apr 08 15:02:54 2013] 如您所
我想使用 GROUP BY WITH ROLLUP 创建一个表并获取总行数而不是 null。 $sql ="SELECT IF(YEAR(transaktioner.datum
我正在创建博客文章,在成功迁移我的博客文件后,当我转到我网站的博客页面时返回一个错误(无法解析其余部分:':“Ymd”'来自'post.date|date: "Ymd"') 我似乎无法确定这是语法错误
我正在尝试获取要插入到 CAML 查询中的月份范围,即:2010-09-01 和 2010-09-30。 我使用以下代码生成这两个值: var month = "10/2010"; var month
如何将代码document.write("直到指定日期")更改为writeMessage(date)中的日期?此外,writeMessage(date) 中的日期未正确显示(仅显示年份)。感谢您帮助解
我在 Windows (XP) 和 Linux 上都尝试过 utime()。在 Windows 上我得到一个 EACCES 错误,在 Linux 上我没有得到任何错误(但时间没有改变)。我的 utim
我正在尝试计算发生在同一日期的值的总和(在 XYZmin 中)。 我的数据看起来像这样, bar <- structure(list(date = structure(c(15622, 15622,
我是一名优秀的程序员,十分优秀!