numpy資料型別

八音幻夢發表於2020-10-20

說明

參考檔案地址: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是不相等的
    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

相關文章