numpy数据类型

说明

参考文件地址:https://github.com/datawhalechina/team-learning-program/tree/master/IntroductionToNumpy

之前都是用到那查那里,这次较为系统的学习,在此记录整理。

numpy数据类型

  • 基本数据类型
    python原生的数据类型较少,为了加以区分 numpy 在这些类型名称末尾都加了“_”
类型备注说明
bool_ = bool88位布尔类型
int8 = byte8位整型
int16 = short16位整型
int32 = intc32位整型
int_ = int64 = long = int0 = intp64位整型
uint8 = ubyte8位无符号整型
uint16 = ushort16位无符号整型
uint32 = uintc32位无符号整型
uint64 = uintp = uint0 = uint64位无符号整型
float16 = half16位浮点型
float32 = single32位浮点型
float_ = float64 = double64位浮点型
str = unicode = str0 = unicodeUnicode字符串
datetime64日期时间类型
timedelta64表示两个时间之间的间隔
  • 注意事项

    • Python 的浮点数通常是64位浮点数,几乎等同于 np.float64

    • Python 的int 是灵活的,整数可以扩展以容纳任何整数并且不会溢出 ;numpy存在溢出风险。
      numpy各整数类型的范围展示如下:

      import numpy as np
      ii16 = np.iinfo(np.int16)
      print(ii16.min) # -32768
      print(ii16.max) # 32767
      ii32 = np.iinfo(np.int32)
      print(ii32.min) # -2147483648
      print(ii32.max) # 2147483647

      numpy浮点型的范围展示如下:

      ff16 = np.finfo(np.float16)
      print(ff16.bits) # 16
      print(ff16.min) # -65500.0
      print(ff16.max) # 65500.0
      print(ff16.eps) # 0.000977
      ff32 = np.finfo(np.float32)
      print(ff32.bits) # 32
      print(ff32.min) # -3.4028235e+38
      print(ff32.max) # 3.4028235e+38
      print(ff32.eps) # 1.1920929e-07

  • 特殊常量

    1. numpy.nan 空值
      注:
      • 两个numpy.nan是不相等的
      • 可以用numpy.isnan()来判断是否为空
        numpy.isnan(x, *args, **kwargs) Test element-wise for NaN and return result as a boolean array
    2. numpy.inf 无穷大
    3. numpy.pi 圆周率
    4. numpy.e 自然常数

时间和日期

  • 基础
    在 numpy 中,我们很方便的将字符串转换成时间日期类型 datetime64(datetime 已被 python 包含的日期时间库所占用)。datatime64是带单位的日期时间类型,其单位如下:
日期单位代码含义时间单位代码含义
Yh小时
Mm分钟
Ws
Dms毫秒
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 类型时,可以强制指定使用的单位。

a = np.datetime64(‘2020-03’, ‘D’)
print(a, a.dtype) # 2020-03-01 datetime64[D]
print(np.datetime64(‘2020-03’) == np.datetime64(‘2020-03-01’)) # True
print(np.datetime64(‘2020-03’) == np.datetime64(‘2020-03-02’)) #False

  • 从字符串创建 datetime64 数组时,如果单位不统一,则一律转化成其中最小的单位

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]

  • 使用arange()创建 datetime64 数组,用于生成日期范围

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]

  • datetime64 和 timedelta64 运算

    • timedelta64 表示两个 datetime64 之间的差。timedelta64 也是带单位的,并且和相减运算中的两个 datetime64 中的较小的单位保持一致.

    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]

    a = np.datetime64(‘2020-03’) + np.timedelta64(20, ‘D’)
    b = np.datetime64(‘2020-06-15 00:00’) + np.timedelta64(12, ‘h’)
    print(a, a.dtype) # 2020-03-21 datetime64[D]
    print(b, b.dtype) # 2020-06-15T12:00 datetime64[m]

    • 注:生成 timedelta64时,要注意年(‘Y’)和月(‘M’)这两个单位无法和其它单位进行运算(一年有几天?一个月有几个小时?这些都是不确定的)

    a = np.timedelta64(1, ‘Y’)
    print(np.timedelta64(a, ‘D’))
    # TypeError: Cannot cast NumPy timedelta64 scalar from metadata [Y] to [D] according to the rule ‘same_kind’

    • timedelta64 间的运算

      a = np.timedelta64(1, ‘Y’)
      b = np.timedelta64(6, ‘M’)
      c = np.timedelta64(1, ‘W’)
      d = np.timedelta64(1, ‘D’)
      e = np.timedelta64(10, ‘D’)

      print(a) # 1 years
      print(b) # 6 months
      print(a + b) # 18 months
      print(a - b) # 6 months
      print(2 * a) # 2 years
      print(a / b) # 2.0
      print(c / d) # 7.0
      print(c % e) # 7 days

    • numpy.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.busday_offset ——— 工作日功能
    numpy.busday_offset(dates, offsets, roll=‘raise’, weekmask=‘1111100’, holidays=None, busdaycal=None, out=None)
    First adjusts the date to fall on a valid day according to the roll rule, then applies offsets to the given dates counted in valid days.
    参数roll:

    {‘raise’, ‘nat’, ‘forward’, ‘following’, ‘backward’, ‘preceding’, ‘modifiedfollowing’, ‘modifiedpreceding’}
    ‘raise’ means to raise an exception for an invalid day.
    ‘nat’ means to return a NaT (not-a-time) for an invalid day.
    ‘forward’ and ‘following’ mean to take the first valid day later in time.
    ‘backward’ and ‘preceding’ mean to take the first valid day earlier in time.

    将指定的偏移量应用于工作日,单位天(‘D’)。计算下一个工作日,如果当前日期为非工作日,默认报错。可以指定 forward 或 backward 规则来避免报错。

    a = np.busday_offset(‘2020-07-11’, offsets=1)
    print(a)
    # ValueError: Non-business day date in busday_offset

    a = np.busday_offset(‘2020-07-11’, offsets=0, roll=‘forward’)
    b = np.busday_offset(‘2020-07-11’, offsets=0, roll=‘backward’)
    print(a) # 2020-07-13
    print(b) # 2020-07-10

    可以指定偏移量为 0 来获取当前日期向前或向后最近的工作日,当然,如果当前日期本身就是工作日,则直接返回当前日期

  • np.is_busday —— 判断指定日期是否是工作日

    b = np.is_busday(‘2020-07-11’)
    print(b) # False

    拓展:

    1. np.count_nonzero(np.is_busday(a)) —— 统计一个 datetime64[D] 数组中的工作日天数
    2. 自定义周掩码值,即指定一周中哪些星期是工作日。

      b = np.is_busday(‘2020-07-10’, weekmask=[1, 1, 1, 1, 0, 0, 1])
      print(b) # False

  • np.busday_count —— 返回两个日期之间的工作日数量

    begindates = np.datetime64(‘2020-07-10’)
    enddates = np.datetime64(‘2020-07-20’)
    a = np.busday_count(begindates, enddates)
    print(a) # 6

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值