比较日期时间的numpy数组和时间戳

时间:2020-01-04 18:49:07

标签: python python-3.x pandas numpy datetime

我不明白为什么这段代码会引发错误。 '>'不是向量化的吗?我可以看到ng-click="toggleDestinationDropDown(true)"比较没有问题。希望能提供见解并提出建议。

x_month_begin[0,0] > st_d

2 个答案:

答案 0 :(得分:1)

如果检查对象的类型,问题将变得很清楚。

  1. x_month_begin:是一个3维的numpy数组(x_month_begin.shape
  2. st_d:是熊猫时间戳记变量

两者不能直接比较。为了进行比较,您可以执行以下操作:

[y > st_d for x in x_month_begin for y in x ]

答案 1 :(得分:1)

因此,您从熊猫结构开始:

janitor::tabyl(data$type)

# data$type n   percent
# Action 5 0.2941176
# Comedy 3 0.1764706
# Drama 5 0.2941176
# Romance 2 0.1176471
# Thriller 2 0.1176471

与numpy数组相同:

In [133]: x_month_begin                                                         
Out[133]: 
DatetimeIndex(['2020-01-01', '2020-02-01', '2020-03-01', '2020-04-01',
               '2020-05-01', '2020-06-01', '2020-07-01', '2020-08-01',
               '2020-09-01', '2020-10-01', '2020-11-01', '2020-12-01'],
              dtype='datetime64[ns]', freq='MS')

您将其操纵为一个(n,3)数组(我怀疑这可以通过重塑和可能的转置来更直接地完成):

In [134]: x_month_begin.values                                                  
Out[134]: 
array(['2020-01-01T00:00:00.000000000', '2020-02-01T00:00:00.000000000',
       '2020-03-01T00:00:00.000000000', '2020-04-01T00:00:00.000000000',
       '2020-05-01T00:00:00.000000000', '2020-06-01T00:00:00.000000000',
       '2020-07-01T00:00:00.000000000', '2020-08-01T00:00:00.000000000',
       '2020-09-01T00:00:00.000000000', '2020-10-01T00:00:00.000000000',
       '2020-11-01T00:00:00.000000000', '2020-12-01T00:00:00.000000000'],
      dtype='datetime64[ns]')

无论如何,现在进行比较:

In [135]: x_month_begin = np.vstack(np.split(x_month_begin, 3))                 
In [138]: x_month_begin = np.transpose(x_month_begin)                           
In [139]: x_month_begin                                                         
Out[139]: 
array([['2020-01-01T00:00:00.000000000', '2020-05-01T00:00:00.000000000',
        '2020-09-01T00:00:00.000000000'],
       ['2020-02-01T00:00:00.000000000', '2020-06-01T00:00:00.000000000',
        '2020-10-01T00:00:00.000000000'],
       ['2020-03-01T00:00:00.000000000', '2020-07-01T00:00:00.000000000',
        '2020-11-01T00:00:00.000000000'],
       ['2020-04-01T00:00:00.000000000', '2020-08-01T00:00:00.000000000',
        '2020-12-01T00:00:00.000000000']], dtype='datetime64[ns]')
In [140]: _.shape                                                               
Out[140]: (4, 3)

In [141]: st_d = pd.to_datetime('01/2016', format="%m/%Y") In [142]: st_d Out[142]: Timestamp('2016-01-01 00:00:00') In [143]: x_month_begin >st_d --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-143-30567662e59d> in <module> ----> 1 x_month_begin >st_d pandas/_libs/tslibs/c_timestamp.pyx in pandas._libs.tslibs.c_timestamp._Timestamp.__richcmp__() TypeError: '<' not supported between instances of 'Timestamp' and 'int' 数组可以进行numpy比较,但是它们具有关于<兼容的某些规则。 (例如,比较字符串和数字不起作用)。此外,dtypes会使用日期和时间玩自己的游戏,某些格式是内部格式,有些与numpy pandas兼容。

例如,如果我们将您的时间戳转换为numpy等效项:

datatime64

比较有效:

In [144]: st_d.to_numpy()                                                       
Out[144]: numpy.datetime64('2016-01-01T00:00:00.000000000')

In [145]: x_month_begin>st_d.to_numpy() Out[145]: array([[ True, True, True], [ True, True, True], [ True, True, True], [ True, True, True]]) 建立在pandas上,或者至少使用numpy数组存储其数据。但是numpy代码都不知道numpy。如果给定一个非numpy对象,它将天真的尝试将其转换,例如

pandas

In [146]: np.asarray(st_d) Out[146]: array(Timestamp('2016-01-01 00:00:00'), dtype=object) 不同。 [146]是产生您的错误的转换。

Out[144]

The original `DatetimeIndex` can be tested against the timestamp. That's a 'pure' pandas operation. In [152]: _133>st_d Out[152]: array([ True, True, True, True, True, True, True, True, True, True, True, True]) 直接给出_133.to_numpy().reshape(-1,4).T数组。