
由于Python自带的datetime格式不太理想,所以Numpy团队在Numpy1.7以后,开发出一种新的数据类型:datetime64。它用来分析时间序列数据。
之所以叫datetime64,是由于Python中已经有了datetime程序包,所以Numpy在datetime加上了64,以示区别。当然,这么做也是有一定原因的。因为,在datetime64中,日期被记录成为64位的整数。不过,datetime64对输入的格式要求比较严格。参见下面的例子。
我们首先需要调用Numpy,然后将datetime64类型的数据‘2020-03-20’赋值给date。
import numpy as npdate =np.array('2020-03-20', dtype=np.datetime64)dateOut[17]:array('2020-03-20', dtype='datetime64[D]')
(滑动可看全部程序,下同)
从结果中我们可以看出date是一个类型为datetime64[D]的矩阵,这里的D代表Day。
我们来看看月份的例子,它和日期的例子类似。
month = np.array('2020-03',dtype=np.datetime64)monthOut[21]: array('2020-03',dtype='datetime64[M]')
注意输出的数据类型为datetime64[M],这里的M代表Month。
当然,除了年月日,还有小时、分钟和秒。程序的写法类似
hms=np.datetime64('2020-03-20 09:29:59',dtype=np.datetime64)hmsOut[32]: numpy.datetime64('2020-03-20T09:29:59')
其实,Numpy还有更多处理日期和时间的功能。不过在介绍它们之前,我们先来复习一下Numpy中的arrange()函数。我们可以通过这个函数产生数组,例如:
a = np.arange(3)print(a)[0 1 2]
在这里,我们用np.arrange(3)定义数组a,其数值包括0,1,2三个数字。
接下来,我们就可以把arrange() 产生的数组和日期、时间进行运算。例如,用日期加上一个数组
date + np.arange(7)Out[25]:array(['2020-03-20', '2020-03-21','2020-03-22', '2020-03-23','2020-03-24', '2020-03-25', '2020-03-26'], dtype='datetime64[D]')
当date加上np.arange(7)以后,就产生了'2020-03-20'到'2020-03-26'的7个日期。
同样,对于月份,我们可以进行类似的操作。
month + np.arange(12)Out[26]:array(['2020-03', '2020-04', '2020-05','2020-06', '2020-07', '2020-08','2020-09', '2020-10', '2020-11', '2020-12', '2021-01', '2021-02'],dtype='datetime64[M]')
当month加上np.arange(12)以后,就产生了'2020-03'到'2021-02'的12个月份。
我们也可以把小时、分钟和秒和arange()相加
hms + np.arange(10)Out[33]:array(['2020-03-20T09:29:59','2020-03-20T09:30:00','2020-03-20T09:30:01', '2020-03-20T09:30:02','2020-03-20T09:30:03', '2020-03-20T09:30:04','2020-03-20T09:30:05', '2020-03-20T09:30:06','2020-03-20T09:30:07', '2020-03-20T09:30:08'],dtype='datetime64[s]')
这样就产生了10秒的数据。
很多时候我们需要两个日期或者时间相减。在Numpy中,允许两个日期或者时间值相减,并产生一个时间单位。Numpy通过timedelta64数据类型表示产生的数据。
我们通过一个例子来说明。比方说你想知道2020年3月20日距离2020年1月1日相差多少天。你可以利用Numpy把这两个日子相减。
np.datetime64('2020-03-20') -np.datetime64('2020-01-01')Out[34]: numpy.timedelta64(79,'D')
从结论中可以看出,这两个日期相距79天,数据类型为timedelta64。
既然可以相减,那么就可以相加。我们可以用一个日期加上天数,然后就可以得到新的日期。
np.datetime64('2020-01-01') +np.timedelta64(80, 'D')Out[38]: numpy.datetime64('2020-03-21')
同样,你也可以把小时和时间相加,如下
np.datetime64('2020-03-21T08:00') +np.timedelta64(12, 'h')Out[39]:numpy.datetime64('2020-03-21T20:00')
甚至还可以做除法。下面的例子是2周除以7天的结果。
np.timedelta64(2,'W') np.timedelta64(7,'D')Out[41]: 2.0
以及求余数。在下面的例子里,1周除以4天的余数是3。
np.timedelta64(1,'W') %np.timedelta64(4,'D')Out[45]: numpy.timedelta64(3,'D')
对于年(‘Y’)和月(‘M’)这两类timedelta的时间单位要特殊对待。这是因为它们代表多少日期取决于如何你如何使用。尽管timedelta的一天等同于24小时,但是每个月却包括不同天数,每年的天数也不同。
x = np.timedelta64(1, 'Y')np.timedelta64(x, 'M')Out[50]: numpy.timedelta64(12,'M')np.timedelta64(x, 'D')Traceback (most recent call last):File "<ipython-input-51-8b51ad6a8acb>", line 1, in<module>np.timedelta64(x, 'D')TypeError: Cannot cast NumPy timedelta64scalar from metadata [Y] to [D] according to the rule 'same_kind'
这个例子告诉我们,Numpy知道1年有12个月,但是不知道1年有多少天!
更多Python文章
Python十二钗之Pandas(3):纽约市Airbnb案例
Python十二钗之Scikit-learn :特朗普的就职演说有何不同?
Python十二钗之Scikit-learn(2):机器学习中的决策树
Python十二钗之Scikit-learn(3):用决策树分析Lending Club的贷款违约数据
Python十二钗之SciPy:早知有SciPy,何必用美拍?
Python十二钗之Matplotlib:画图原来如此简单!




