Numpy学习笔记(一):时间日期和时间增量

Numpy学习笔记

  • 一、时间日期和时间增量
    • 1.时间日期 datetime64(一种数据类型)
      • 1)关于单位
        • a 单位的自动选择
        • b 单位的强制转化
      • 2)与arrange结合生成日期范围
    • 2 时间增量 timedelta64
    • 3 工作日(busday)功能
      • 1)numpy.busday_offset()
      • 2)numpy.is_busday()
      • 3)numpy.busday_count()

一、时间日期和时间增量

1.时间日期 datetime64(一种数据类型)

datatime64是带单位的日期时间类型,其单位如下:

日期单位 代码含义 时间单位 代码含义
Y h 小时
M m 分钟
W s
D ms 毫秒
- - us 微秒
- - ns 纳秒
- - ps 皮秒
- - fs 飞秒
- - as 阿托秒

1)关于单位

a 单位的自动选择

从字符串创建 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]

b 单位的强制转化

从字符串创建 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

2)与arrange结合生成日期范围

使用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]

2 时间增量 timedelta64

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'

3 工作日(busday)功能

1)numpy.busday_offset()

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参数进行分析,如果当前日期非工作日,默认报错。可以指定 forwardbackward 规则来避免报错。(一个是向前取第一个有效的工作日,一个是向后取第一个有效的工作日)

值得一提的是,如果当前日期工作日,那么不论我们通过控制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']

2)numpy.is_busday()

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

3)numpy.busday_count()

函数的功能为返回两个日期之间的工作日的数量

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中时间日期和时间增量的全部内容。如果您在阅读过程中发现了本文的不足或者错误,请您在下方留言以批评指正,本人一定及时修改。感谢您阅读本文!

你可能感兴趣的:(Numpy学习笔记,numpy,学习,python,机器学习)