【问题标题】:Converting pandas datetime to numpy datetime将熊猫日期时间转换为 numpy 日期时间
【发布时间】:2020-04-14 09:22:12
【问题描述】:

一个相当简单的问题,我似乎无法弄清楚。

设置

给定datetime.date 或pandas.datetime,我试图将一些不可避免地通过pandas.to_datetime 转换为与numpy.busday_offset 一起使用时失败的对象偏移,如下例所示。

import numpy as np
import pandas as pd
#Works fine
np.busday_offset(datetime.date(2020, 1, 1), 3)
# Fails
np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)), 3)
# Fails
np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)).to_numpy(), 3)
#Works fine
pd.bdate_range(start = datetime.date(2020, 1, 1), 
               end = datetime.date(2020, 4, 14), 
               freq = '20B')
# Fails
np.busday_offset(pd.bdate_range(start = datetime.date(2020, 1, 1), 
                                end = datetime.date(2020, 4, 14), 
                                freq = '20B'), 3)

问题

如何从datetime64[ns](由pandas.to_datetime 或pandas.bdate_date 创建)格式的日期变为datetime64[D](由numpy.busday_offset 识别?

【问题讨论】:

    标签: python-3.x pandas numpy datetime64


    【解决方案1】:

    问题似乎是 pd.to_datetime 生成的数据类型与 np.busday_offset 不兼容。需要先转换成日期。

    np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)).date(), 3)
    

    对于 date_range 类似,您可以执行以下操作:

    drange = pd.bdate_range(start = datetime.date(2020, 1, 1), end = datetime.date(2020, 4, 14),freq = '20B')
    np.busday_offset([e.date() for e in drange], 3)
    

    【讨论】:

      【解决方案2】:

      除了艾伦的答案,我和一些同事一起找到了另一个答案

      import numpy as np
      import pandas as pd
      #Works fine
      np.busday_offset(datetime.date(2020, 1, 1), 3)
      # works fine now
      np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)).to_numpy().astype('datetime64[D]'), 3)
      # works fine now
      np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)).to_numpy().astype('datetime64[D]'), 3)
      #Works fine
      pd.bdate_range(start = datetime.date(2020, 1, 1), 
                     end = datetime.date(2020, 4, 14), 
                     freq = '20B')
      # works fine now
      np.busday_offset(pd.bdate_range(start = datetime.date(2020, 1, 1), 
                                      end = datetime.date(2020, 4, 14), 
                                      freq = '20B').to_numpy().astype('datetime64[D]'), 3)
      

      【讨论】:

        猜你喜欢
        • 2016-07-05
        • 2017-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        相关资源
        最近更新 更多