datetime64 基础

在 numpy 中,我们很方便的将字符串转换成时间日期类型 datetime64datetime 已被 python 包含的日期时间库所占用)。
datatime64是带单位的日期时间类型,其单位如下:
image.png
注意:

  • 1秒 = 1000 毫秒(milliseconds)
  • 1毫秒 = 1000 微秒(microseconds)

【例】从字符串创建 datetime64 类型时,默认情况下,numpy 会根据字符串自动选择对应的单位。

  1. import numpy as np
  2. a = np.datetime64('2020-03-01')
  3. print(a, a.dtype) # 2020-03-01 datetime64[D]
  4. a = np.datetime64('2020-03')
  5. print(a, a.dtype) # 2020-03 datetime64[M]
  6. a = np.datetime64('2020-03-08 20:00:05')
  7. print(a, a.dtype) # 2020-03-08T20:00:05 datetime64[s]
  8. a = np.datetime64('2020-03-08 20:00')
  9. print(a, a.dtype) # 2020-03-08T20:00 datetime64[m]
  10. a = np.datetime64('2020-03-08 20')
  11. print(a, a.dtype) # 2020-03-08T20 datetime64[h]

【例】从字符串创建 datetime64 类型时,可以强制指定使用的单位。

  1. import numpy as np
  2. a = np.datetime64('2020-03', 'D')
  3. print(a, a.dtype) # 2020-03-01 datetime64[D]
  4. a = np.datetime64('2020-03', 'Y')
  5. print(a, a.dtype) # 2020 datetime64[Y]
  6. print(np.datetime64('2020-03') == np.datetime64('2020-03-01')) # True
  7. print(np.datetime64('2020-03') == np.datetime64('2020-03-02')) #False

由上例可以看出,2019-03 和 2019-03-01 所表示的其实是同一个时间。 事实上,如果两个 datetime64 对象具有不同的单位,它们可能仍然代表相同的时刻。并且从较大的单位(如月份)转换为较小的单位(如天数)是安全的。

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

  1. import numpy as np
  2. a = np.array(['2020-03', '2020-03-08', '2020-03-08 20:00'], dtype='datetime64')
  3. print(a, a.dtype)
  4. # ['2020-03-01T00:00' '2020-03-08T00:00' '2020-03-08T20:00'] datetime64[m]

【例】使用arange()创建 datetime64 数组,用于生成日期范围。

  1. import numpy as np
  2. a = np.arange('2020-08-01', '2020-08-10', dtype=np.datetime64)
  3. print(a)
  4. # ['2020-08-01' '2020-08-02' '2020-08-03' '2020-08-04' '2020-08-05'
  5. # '2020-08-06' '2020-08-07' '2020-08-08' '2020-08-09']
  6. print(a.dtype) # datetime64[D]
  7. a = np.arange('2020-08-01 20:00', '2020-08-10', dtype=np.datetime64)
  8. print(a)
  9. # ['2020-08-01T20:00' '2020-08-01T20:01' '2020-08-01T20:02' ...
  10. # '2020-08-09T23:57' '2020-08-09T23:58' '2020-08-09T23:59']
  11. print(a.dtype) # datetime64[m]
  12. a = np.arange('2020-05', '2020-12', dtype=np.datetime64)
  13. print(a)
  14. # ['2020-05' '2020-06' '2020-07' '2020-08' '2020-09' '2020-10' '2020-11']
  15. print(a.dtype) # datetime64[M]

datetime64 和 timedelta64 运算

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

  1. import numpy as np
  2. a = np.datetime64('2020-03-08') - np.datetime64('2020-03-07')
  3. b = np.datetime64('2020-03-08') - np.datetime64('202-03-07 08:00')
  4. c = np.datetime64('2020-03-08') - np.datetime64('2020-03-07 23:00', 'D')
  5. print(a, a.dtype) # 1 days timedelta64[D]
  6. print(b, b.dtype) # 956178240 minutes timedelta64[m]
  7. print(c, c.dtype) # 1 days timedelta64[D]
  8. a = np.datetime64('2020-03') + np.timedelta64(20, 'D')
  9. b = np.datetime64('2020-06-15 00:00') + np.timedelta64(12, 'h')
  10. print(a, a.dtype) # 2020-03-21 datetime64[D]
  11. print(b, b.dtype) # 2020-06-15T12:00 datetime64[m]

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

  1. import numpy as np
  2. a = np.timedelta64(1, 'Y')
  3. b = np.timedelta64(a, 'M')
  4. print(a) # 1 years
  5. print(b) # 12 months
  6. c = np.timedelta64(1, 'h')
  7. d = np.timedelta64(c, 'm')
  8. print(c) # 1 hours
  9. print(d) # 60 minutes
  10. print(np.timedelta64(a, 'D'))
  11. # TypeError: Cannot cast NumPy timedelta64 scalar from metadata [Y] to [D] according to the rule 'same_kind'
  12. print(np.timedelta64(b, 'D'))
  13. # TypeError: Cannot cast NumPy timedelta64 scalar from metadata [M] to [D] according to the rule 'same_kind'

【例】timedelta64 的运算。

  1. import numpy as np
  2. a = np.timedelta64(1, 'Y')
  3. b = np.timedelta64(6, 'M')
  4. c = np.timedelta64(1, 'W')
  5. d = np.timedelta64(1, 'D')
  6. e = np.timedelta64(10, 'D')
  7. print(a) # 1 years
  8. print(b) # 6 months
  9. print(a + b) # 18 months
  10. print(a - b) # 6 months
  11. print(2 * a) # 2 years
  12. print(a / b) # 2.0
  13. print(c / d) # 7.0
  14. print(c % e) # 7 days

【例】numpy.datetime64 与 datetime.datetime 相互转换

  1. import numpy as np
  2. import datetime
  3. dt = datetime.datetime(year=2020, month=6, day=1, hour=20, minute=5, second=30)
  4. dt64 = np.datetime64(dt, 's')
  5. print(dt64, dt64.dtype)
  6. # 2020-06-01T20:05:30 datetime64[s]
  7. dt2 = dt64.astype(datetime.datetime)
  8. print(dt2, type(dt2))
  9. # 2020-06-01 20:05:30 <class 'datetime.datetime'>

datetime64 的应用