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
是的,这对我来说看起来像是一个错误。归结为以下部分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)
如果哈希值不相同,则无法在集合中进行成员资格测试。我可以想出几种方法来解决这个问题,但是选择最好的方法将取决于他们在实现时间戳时所做的设计选择,而我没有资格对此发表评论。
| 归档时间: |
|
| 查看次数: |
2885 次 |
| 最近记录: |