numpy 学习:数据类型(包括日期时间)和空值
NumPy是Python中用于科学计算的基础软件包,专门用于处理矩阵,数据类型是数值型的,用于对数值数据进行快速的计算。因此,numpy支持的数据类型非常精细,但是numpy不支持精确小数。
在导入numpy模块时,通常把numpy模块重命名为np:
import numpy as np
一,numpy的数据类型
Numpy支持的标量数据类型非常繁杂,我比较喜欢固定size的数据类型,因为固定size的数据类型跟平台无关,且命名格式比较规范,格式是:[u]type[size],u代表无符号,size代表占用的内存空间。
1,布尔类型
- numpy.bool8
2,有符号的整数类型:
- numpy.int8
- numpy.int16
- numpy.int32
- numpy.int64
3,无符号的整数类型:
- numpy.uint8
- numpy.uint16
- numpy.uint32
- numpy.uint64
4,浮点数类型:
- numpy.float16
- numpy.float32
- numpy.float64
- numpy.float96
- numpy.float128
5,复数类型:
- numpy.complex64
- numpy.complex128
- numpy.complex192
- numpy.complex256
6,汇总
numpy支持的数据类型如下表所示:
| 类型 | 比特位 | 说明 |
|---|---|---|
| bool_ = bool8 | 8位 | 布尔类型 |
| int8 = byte | 8位 | 整型 |
| int16 = short | 16位 | 整型 |
| int32 = intc | 32位 | 整型 |
| int_ = int64 = long | 64位 | 整型 |
| uint8 = ubyte | 8位 | 无符号整型 |
| uint16 = ushort | 16位 | 无符号整型 |
| uint32 = uintc | 32位 | 无符号整型 |
| uint64 = uintp | 64位 | 无符号整型 |
| float16 | 16位 | 浮点型 |
| float32 = single | 32位 | 浮点型 |
| float_ = float64 = double | 64位 | 浮点型 |
| str_ = unicode_ = unicode | Unicode 字符串 | |
| datetime64 | 日期时间类型 | |
| timedelta64 | 表示两个时间之间的间隔 |
二,浮点数类型
Python 的浮点数通常是64位浮点数,几乎等同于 np.float64
数据类型的信息,可以通过finfo来查看浮点数的类型信息,通过iinfo函数来查看整数的类型信息,
finfo.eps表示1.0和下一个大于1.0的最小的浮点数之间的差异值。
ff16 = np.finfo(np.float16) print(ff16.bits) # 16 print(ff16.min) # -65500.0 print(ff16.max) # 65500.0 print(ff16.eps) # 0.000977
三,数据类型和dtype的关系
numpy 的数值类型实际上是 dtype 对象的实例。每个内建类型都有一个唯一定义它的字符代码,如下:
| 字符 | 对应类型 | 备注 |
|---|---|---|
| b | boolean | 'b1' |
| i | signed integer | 'i1', 'i2', 'i4', 'i8' |
| u | unsigned integer | 'u1', 'u2' ,'u4' ,'u8' |
| f | floating-point | 'f2', 'f4', 'f8' |
| c | complex floating-point | |
| m | timedelta64 | 表示两个时间之间的间隔 |
| M | datetime64 | 日期时间类型 |
| O | object | |
| S | (byte-)string | S3表示长度为3的字符串 |
| U | Unicode | Unicode 字符串 |
| V | void |
例如:
import numpy as np a = np.dtype('b1') print(a.type) # <class 'numpy.bool_'> print(a.itemsize) # 1 a = np.dtype('i1') print(a.type) # <class 'numpy.int8'> print(a.itemsize) # 1 a = np.dtype('i2') print(a.type) # <class 'numpy.int16'> print(a.itemsize) # 2 a = np.dtype('i4') print(a.type) # <class 'numpy.int32'> print(a.itemsize) # 4 a = np.dtype('i8') print(a.type) # <class 'numpy.int64'> print(a.itemsize) # 8 a = np.dtype('u1') print(a.type) # <class 'numpy.uint8'> print(a.itemsize) # 1 a = np.dtype('u2') print(a.type) # <class 'numpy.uint16'> print(a.itemsize) # 2 a = np.dtype('u4') print(a.type) # <class 'numpy.uint32'> print(a.itemsize) # 4 a = np.dtype('u8') print(a.type) # <class 'numpy.uint64'> print(a.itemsize) # 8 a = np.dtype('f2') print(a.type) # <class 'numpy.float16'> print(a.itemsize) # 2 a = np.dtype('f4') print(a.type) # <class 'numpy.float32'> print(a.itemsize) # 4 a = np.dtype('f8') print(a.type) # <class 'numpy.float64'> print(a.itemsize) # 8 a = np.dtype('S') print(a.type) # <class 'numpy.bytes_'> print(a.itemsize) # 0 a = np.dtype('S3') print(a.type) # <class 'numpy.bytes_'> print(a.itemsize) # 3 a = np.dtype('U3') print(a.type) # <class 'numpy.str_'> print(a.itemsize) # 12
四,日期和时间类型
numpy的日期和时间类型是datetime64,64是指64个bit,也就是8Byte。datetime64的单位分为日期单位和时间单位,日期单位的级别都大于时间单位。
日期单位是:年(Y),月(M),周(W),天(D),单位级别依次减小,
时间单位(unit)是:时(h),分(m),秒(s),毫秒(ms),微妙(us),纳秒(ns),单位级别依次减小,
- 1秒 = 1000 毫秒(milliseconds)
- 1毫秒 = 1000 微秒(microseconds
通过var_name.dtype来查看datetime64的类型时,会输出datetime64的单位,格式是datetime64[unit],其中unit就是日期和时间的单位。
1,通过字符串创建日期和时间类型
通过字符串来创建日期时间类型,默认情况下,numpy会根据字符串来自动选择日期和时间单位,datetime64的单位是级别最小的单位,举个例子:
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]
2,自动转换时间单位,自动地从较大的时间单位转换为较小的时间单位。
事实上,如果两个 datetime64 对象具有不同的单位,它们可能仍然代表相同的时刻。并且从较大的单位(如月份)转换为较小的单位(如天数)是安全的。
【例】从字符串创建 datetime64 数组时,如果单位不统一,则一律转化成其中最小的单位。
import numpy as np a = np.array(['2020-03', '2020-03-08', '2020-03-08 20:00'], dtype='datetime64') print(a, a.dtype) # ['2020-03-01T00:00' '2020-03-08T00:00' '2020-03-08T20:00'] datetime64[m]
3,时间差量
timedelta64 表示两个 datetime64 之间的差值,timedelta64是带单位的,和相减运算中的两个 datetime64 中的较小的单位保持一致。
delt1 = np.datetime64('2020-03-08') - np.datetime64('2020-03-07')
delt1 表示两个日期之间的差值,单位是D。
NumPy允许两个Datetime64值相减,这个操作产生一个带有时间单位的数字。timedelta64的参数是一个数字(用于表示单位数),以及日期/时间单位,如 (D)ay, (M)onth, (Y)ear, (h)ours, (m)inutes, 或者 (s)econds。timedelta64数据类型也接受字符串“NAT”代替“非时间”值的数字。
例如,下面的timedelta64表示差异1天:
>>> numpy.timedelta64(1, 'D')
Datetimes 和 Timedeltas 一起工作,提供日期的加减计算:
>>> np.datetime64('2009-01-01') - np.datetime64('2008-01-01')
numpy.timedelta64(366,'D')
>>> np.datetime64('2009') + np.timedelta64(20, 'D')
numpy.datetime64('2009-01-21')
4,np.datetime64 和 datetime.datetime之间的转换
import numpy as np import datetime dt = datetime.datetime(year=2020, month=6, day=1, hour=20, minute=5, second=30) dt64 = np.datetime64(dt, 's') print(dt64, dt64.dtype) # 2020-06-01T20:05:30 datetime64[s] dt2 = dt64.astype(datetime.datetime) print(dt2, type(dt2)) # 2020-06-01 20:05:30 <class 'datetime.datetime'>
五,numpy的空值
nan表示空值,两个nan是不相等的。
print(np.nan == np.nan) # False print(np.nan != np.nan) # True
参考文档:

浙公网安备 33010602011771号