ISIN功能不适用于日期

Dat*_*vid 9 python pandas

d = {'Dates':[pd.Timestamp('2013-01-02'),
              pd.Timestamp('2013-01-03'),
              pd.Timestamp('2013-01-04')],
     'Num1':[1,2,3],
     'Num2':[-1,-2,-3]}


df = DataFrame(data=d)  
Run Code Online (Sandbox Code Playgroud)

我们有这个数据框架

Dates                  Num1 Num2
0   2013-01-02 00:00:00  1  -1
1   2013-01-03 00:00:00  2  -2
2   2013-01-04 00:00:00  3  -3  

Dates    datetime64[ns]
Num1              int64
Num2              int64
dtype: object
Run Code Online (Sandbox Code Playgroud)

这给了我

df['Dates'].isin([pd.Timestamp('2013-01-04')])  

0    False
1    False
2    False
Name: Dates, dtype: bool  
Run Code Online (Sandbox Code Playgroud)

我期待"2013-01-04"的日期为真,我错过了什么?我使用最新的0.12版Pandas

DSM*_*DSM 1

是的,这对我来说看起来像是一个错误。归结为以下部分lib.ismember

for i in range(n):
    val = util.get_value_at(arr, i)
    if val in values:
        result[i] = 1
    else: 
        result[i] = 0
Run Code Online (Sandbox Code Playgroud)

val是一个numpy.datetime64对象,并且values是对象set的一个Timestamp​​。测试成员资格应该可以,但不行:

>>> import pandas as pd, numpy as np
>>> ts = pd.Timestamp('2013-01-04')
>>> ts
Timestamp('2013-01-04 00:00:00', tz=None)
>>> dt64 = np.datetime64(ts)
>>> dt64
numpy.datetime64('2013-01-03T19:00:00.000000-0500')
>>> dt64 == ts
True
>>> dt64 in [ts]
True
>>> dt64 in {ts}
False
Run Code Online (Sandbox Code Playgroud)

我认为通常这种行为——在列表中工作,而不是在集合中工作——是由于出现了问题__hash__

>>> hash(dt64)
1357257600000000
>>> hash(ts)
-7276108168457487299
Run Code Online (Sandbox Code Playgroud)

如果哈希值不相同,则无法在集合中进行成员资格测试。我可以想出几种方法来解决这个问题,但是选择最好的方法将取决于他们在实现时间戳时所做的设计选择,而我没有资格对此发表评论。