13
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)  

このデータフレームがあります

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

これは私に与えます

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

0    False
1    False
2    False
Name: Dates, dtype: bool  

日付「2013-01-04」の True を期待していますが、何が欠けていますか? Pandas の最新の 0.12 バージョンを使用しています

4

4 に答える 4

2

私は同じバージョンのパンダを持っています.@DSMの答えは役に立ちました. もう 1 つの回避策は、apply メソッドを使用することです。

>>> df.Dates.apply(lambda date: date in [pd.Timestamp('2013-01-04')])

0    False
1    False
2     True
Name: Dates, dtype: bool
于 2017-01-30T02:47:16.483 に答える
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

valnumpy.datetime64オブジェクトでありvaluessetオブジェクト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

私は通常、リストで動作し、セットで動作しないという動作は、何かがうまくいかないことが原因だと思います__hash__:

>>> hash(dt64)
1357257600000000
>>> hash(ts)
-7276108168457487299

ハッシュが同じでない場合、セットでメンバーシップ テストを行うことはできません。これを修正する方法はいくつか考えられますが、最適な方法を選択することは、私がコメントする資格のないタイムスタンプを実装するときに行った設計上の選択によって異なります。

于 2013-09-28T18:50:46.153 に答える
0

私の場合、文字列を使用するとうまくいくことがわかりました。

df['Dates'].isin(['2013-01-04'])
0    False
1    False
2     True
Name: Dates, dtype: bool
df_qry = df['Dates'][df['Num1']>=2]
1   2013-01-03
2   2013-01-04
Name: Dates, dtype: datetime64[ns]
df_mask = df['Dates'].isin(df_qry.astype(str))
0    False
1     True
2     True
Name: Dates, dtype: bool
df[df_mask]
    Dates   Num1    Num2
1   2013-01-03  2   -2
2   2013-01-04  3   -3

補足:これはrangebreaks、次のようなプロット時系列を設定するのに非常に便利でした:

fig.update_yaxes(rangebreaks=[dict(values=df.index[df_mask].astype(str))])
于 2021-03-29T12:28:54.153 に答える