datatime64是带单位的日期时间类型,其单位如下:
日期单位 | 代码含义 | 时间单位 | 代码含义 |
---|---|---|---|
Y | 年 | h | 小时 |
M | 月 | m | 分钟 |
W | 周 | s | 秒 |
D | 天 | ms | 毫秒 |
- | - | us | 微秒 |
- | - | ns | 纳秒 |
- | - | ps | 皮秒 |
- | - | fs | 飞秒 |
- | - | as | 阿托秒 |
从字符串创建 datetime64 类型时,默认情况下,numpy 会根据字符串自动选择
对应的单位。
import numpy as np
a = np.datetime64('2020-03-01')
print(a, a.dtype) # 2020-03-01 datetime64[D]
a = np.datetime64('2020-03')
print(a, a.dtype) # 2020-03 datetime64[M]
a = np.datetime64('2020-03-08 20:00:05')
print(a, a.dtype) # 2020-03-08T20:00:05 datetime64[s]
a = np.datetime64('2020-03-08 20:00')
print(a, a.dtype) # 2020-03-08T20:00 datetime64[m]
a = np.datetime64('2020-03-08 20')
print(a, a.dtype) # 2020-03-08T20 datetime64[h]
从字符串创建 datetime64 类型时,可以强制指定
使用的单位。
import numpy as np
a = np.datetime64('2020-03', 'D')
print(a, a.dtype) # 2020-03-01 datetime64[D]
a = np.datetime64('2020-03', 'Y')
print(a, a.dtype) # 2020 datetime64[Y]
print(np.datetime64('2020-03') == np.datetime64('2020-03-01')) # True
print(np.datetime64('2020-03') == np.datetime64('2020-03-02')) #False
使用arange()创建 datetime64 数组,用于生成日期范围
。生成的日期范围会自动调整到与两个datetime64 中的较小的单位保持一致。
import numpy as np
a = np.arange('2020-08-01', '2020-08-10', dtype=np.datetime64)
print(a)
# ['2020-08-01' '2020-08-02' '2020-08-03' '2020-08-04' '2020-08-05'
# '2020-08-06' '2020-08-07' '2020-08-08' '2020-08-09']
print(a.dtype) # datetime64[D]
a = np.arange('2020-08-01 20:00', '2020-08-10', dtype=np.datetime64)
print(a)
# ['2020-08-01T20:00' '2020-08-01T20:01' '2020-08-01T20:02' ...
# '2020-08-09T23:57' '2020-08-09T23:58' '2020-08-09T23:59']
print(a.dtype) # datetime64[m]
a = np.arange('2020-05', '2020-12', dtype=np.datetime64)
print(a)
# ['2020-05' '2020-06' '2020-07' '2020-08' '2020-09' '2020-10' '2020-11']
print(a.dtype) # datetime64[M]
timedelta64 表示两个 datetime64 之间的差。timedelta64 也是带单位的,并且和相减运算中的两个 datetime64 中的较小的单位保持一致。
另外生成 timedelta64时,要注意年(‘Y’)和月(‘M’)这两个单位无法和其它单位进行运算(一年有几天?一个月有几个小时?这些都是不确定的)。
import numpy as np
a = np.datetime64('2020-03-08') - np.datetime64('2020-03-07')
b = np.datetime64('2020-03-08') - np.datetime64('202-03-07 08:00')
c = np.datetime64('2020-03-08') - np.datetime64('2020-03-07 23:00', 'D')
print(a, a.dtype) # 1 days timedelta64[D]
print(b, b.dtype) # 956178240 minutes timedelta64[m]
print(c, c.dtype) # 1 days timedelta64[D]
import numpy as np
a = np.timedelta64(1, 'Y')
b = np.timedelta64(a, 'M')
print(np.timedelta64(a, 'D'))
# TypeError: Cannot cast NumPy timedelta64 scalar from metadata [Y] to [D] according to the rule 'same_kind'
print(np.timedelta64(b, 'D'))
# TypeError: Cannot cast NumPy timedelta64 scalar from metadata [M] to [D] according to the rule 'same_kind'
numpy.busday_offset(dates, offsets, roll='raise', weekmask='1111100', holidays=None, busdaycal=None, out=None)
参数简析:
dates:array_like of datetime64[D],即需要处理的日期数组
weekmask:str or array_like of bool, optional,即规定的一周工作日与非工作日分别为哪天(默认为1111100
,即周六、周日为非工作日)。
holidays:array_like of datetime64[D], optional,即可以人工设置哪一天为假期(非工作日),默认为None
。
busdaycal:busdaycalendar, optional,即可以人工指定哪一天为工作日,如果设置此参数,则指定的weekmask
参数以及holidays
参数都会无效,默认为None
。
out:如果提供,则用结果填充该数组,默认为None
。
offsets:偏移量数组,若小于零,则返回在工作日中向前查找offsets绝对值大小步长的日期;若大于零,则返回在工作日中向后查找offsets绝对值大小步长的日期。
import numpy as np
# 2022-07-07 星期四
for i in range(-5,5):
a = np.busday_offset('2022-07-07', offsets=i)
print(a)
# 2022 - 06 - 30
# 2022 - 07 - 01
# 2022 - 07 - 04
# 2022 - 07 - 05
# 2022 - 07 - 06
# 2022 - 07 - 07
# 2022 - 07 - 08
# 2022 - 07 - 11
# 2022 - 07 - 12
# 2022 - 07 - 13
roll:本笔记仅对于roll中的backward
以及forward
参数进行分析,如果当前日期为非工作日,默认报错。可以指定 forward
或 backward
规则来避免报错。(一个是向前取第一个有效的工作日,一个是向后取第一个有效的工作日)
值得一提的是,如果当前日期为工作日,那么不论我们通过控制offsets参数怎么调节偏移量,实际上以上两个参数是不起作用的
import numpy as np
# # 2022-07-07 星期四
i=2
a = np.busday_offset('2022-07-07', offsets=i)
print(a)
a = np.busday_offset('2022-07-07', offsets=i,roll='backward')
print(a)
a = np.busday_offset('2022-07-07', offsets=i,roll='forward')
print(a)
#2022-07-11
#2022-07-11
#2022-07-11
import numpy as np
# # 2022-07-07 星期四
i=-5
a = np.busday_offset('2022-07-07', offsets=i)
print(a)
a = np.busday_offset('2022-07-07', offsets=i,roll='backward')
print(a)
a = np.busday_offset('2022-07-07', offsets=i,roll='forward')
print(a)
#2022-06-30
#2022-06-30
#2022-06-30
但是当前日期为非工作日且对于偏移量进行调节的时候,出现的结果却有点让人疑惑了。这里也希望明白的小伙伴可以在文章下方留言进行进一步探讨呀!
import numpy as np
# 2022-07-09 星期六
i=0,1
a = np.busday_offset('2022-07-09', offsets=i,roll='backward')
print(a)
a = np.busday_offset('2022-07-09', offsets=i,roll='forward')
print(a)
# ['2022-07-08' '2022-07-11']
# ['2022-07-11' '2022-07-12']
numpy.is_busday(dates, weekmask='1111100', holidays=None, busdaycal=None, out=None)
函数的功能为返回指定日期是否为工作日。
import numpy as np
# 2020-07-10 星期五
a = np.is_busday('2020-07-10')
b = np.is_busday('2020-07-11')
print(a) # True
print(b) # False
此函数还可以用于统计一段时间内的天数
iimport numpy as np
# 2020-07-10 星期五
begindates = np.datetime64('2020-07-10')
enddates = np.datetime64('2020-07-20')
a = np.arange(begindates, enddates, dtype='datetime64')
b = np.count_nonzero(np.is_busday(a))
print(a)
# ['2020-07-10' '2020-07-11' '2020-07-12' '2020-07-13' '2020-07-14'
# '2020-07-15' '2020-07-16' '2020-07-17' '2020-07-18' '2020-07-19']
print(b) # 6
函数的功能为返回两个日期之间的工作日的数量
numpy.busday_count(begindates, enddates, weekmask='1111100', holidays=[], busdaycal=None, out=None)
import numpy as np
# 2020-07-10 星期五
begindates = np.datetime64('2020-07-10')
enddates = np.datetime64('2020-07-20')
a = np.busday_count(begindates, enddates)
b = np.busday_count(enddates, begindates)
print(a) # 6
print(b) # -6
以上便是有关Numpy中时间日期和时间增量的全部内容。如果您在阅读过程中发现了本文的不足或者错误,请您在下方留言以批评指正,本人一定及时修改。感谢您阅读本文!