暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python十二钗之Numpy(3):如何处理日期和时间

健谈始于戊戌年 2021-07-01
2883

由于Python自带的datetime格式不太理想,所以Numpy团队在Numpy1.7以后,开发出一种新的数据类型:datetime64。它用来分析时间序列数据。

 

之所以叫datetime64,是由于Python中已经有了datetime程序包,所以Numpy在datetime加上了64,以示区别。当然,这么做也是有一定原因的。因为,在datetime64中,日期被记录成为64位的整数。不过,datetime64对输入的格式要求比较严格。参见下面的例子。

 

我们首先需要调用Numpy,然后将datetime64类型的数据‘2020-03-20’赋值给date。

 

    import numpy as np
    date =np.array('2020-03-20', dtype=np.datetime64)
    date
    Out[17]:array('2020-03-20', dtype='datetime64[D]')

    (滑动可看全部程序,下同)


    从结果中我们可以看出date是一个类型为datetime64[D]的矩阵,这里的D代表Day。

     

    我们来看看月份的例子,它和日期的例子类似。

     

      month = np.array('2020-03',dtype=np.datetime64)
      month
      Out[21]: array('2020-03',dtype='datetime64[M]')

       

      注意输出的数据类型为datetime64[M],这里的M代表Month。

       

      当然,除了年月日,还有小时、分钟和秒。程序的写法类似


        hms=np.datetime64('2020-03-20 09:29:59',dtype=np.datetime64)
        hms
        Out[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)!


                            Python中的大熊猫(Pandas)之二


                            Python十二钗之Pandas(3):纽约市Airbnb案例


                            Python中Numpy的基础知识(1)


                            Python十二钗之Numpy(2)


                            Python十二钗之Scikit-learn :特朗普的就职演说有何不同?


                            Python十二钗之Scikit-learn(2):机器学习中的决策树


                            Python十二钗之Scikit-learn(3):用决策树分析Lending Club的贷款违约数据


                            Python十二钗之SciPy:早知有SciPy,何必用美拍?


                            Python十二钗之Matplotlib:画图原来如此简单!


                            Python十二钗之NLTK:文本分析神器


                            Python十二钗之NLTK:文本的情感分析


                            Python十二钗之NLTK:文本模型的设计和评估!


                            Python金融时间序列分析入门


                            Python金融时间序列分析入门(2)

                            文章转载自健谈始于戊戌年,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论