2017-06-17 4 views
1

バグ?もしそうなら、回避策はありますか?パンダ別のタイムスタンプ値と1つのdfのヌル日時値の置換

df1['DecisionDate'].head() 
Out[238]: 
ID 
RED   2017-02-13 00:00:00 
GREEN   2016-07-29 00:00:00 
ORANGE   2017-01-26 00:00:00 
PURPLE   2016-10-31 00:00:00 
YELLOW   NaT 
Name: DecisionDate, dtype: datetime64[ns] 

をそして、この:

for ID in df2.index: 

    df1.ix[ID,'DecisionDate'] = df2.ix[ID,'DecisionDate'] 

を私はこの

TypeError: long() argument must be a string or a number, not 'Timestamp' 
を取得:今、私はこれを行うにしようとした場合

df2['DecisionDate'] 
Out[239]: 
YELLOW 2014-04-05 00:00:00 
Name: DecisionDate, dtype: datetime64[ns] 

私には、以下の持っています

何を試しても、pd.NaTをタイムスタンプ値に置き換えることはできません。

両方のデータフレームの値はすべてタイムスタンプです。 df2観測値はdf1観測値のサブセットであるため、df2.indexのすべての値はdf1.indexにあります。

私は簡単なことを見落としていますか?それともバグですか?

ご協力いただきありがとうございます。

編集

完全なトレースバックがあります。私はこれを読んで良いじゃないけど、多分それは診断に役立ちます:

File "C:\Users\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 141, in __setitem__ 
    def _slice(self, obj, axis=0, kind=None): 

    File "C:\Users\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 533, in _setitem_with_indexer 

    File "C:\Users\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 473, in setter 
    value = getattr(value, 'values', value).ravel() 

    File "C:\Users\Anaconda2\lib\site-packages\pandas\core\internals.py", line 3168, in setitem 

    File "C:\Users\Anaconda2\lib\site-packages\pandas\core\internals.py", line 3056, in apply 
    align_copy = False 

    File "C:\Users\Anaconda2\lib\site-packages\pandas\core\internals.py", line 668, in setitem 
    def _replace_single(self, *args, **kwargs): 

    File "C:\Users\Anaconda2\lib\site-packages\pandas\core\internals.py", line 2265, in _try_coerce_args 
    Parameters 

TypeError: long() argument must be a string or a number, not 'Timestamp' 
+0

私は複製できません。 Python、Pandas、OSなどのバージョンは? –

+0

Windows 7. Python 2.7.13。スパイダー3.1.4パンダ0.20.2。 – Windstorm1981

+0

私はSpyder以外のすべてにマッチしています。実行するために直接コピー/ペーストできるサンプルデータを作成することをお勧めします。 IEは 'read_csv'、' read_fwf'、または 'DataFrame'の直接構築の呼び出しです。ここを参照してください:https://stackoverflow.com/questions/43945424/python-pandas-multiply-dataframe-by-weights-that -vary-with-vectorize/43947807#43947807 –

答えて

0

これはSpyderのバグです。

for ID in df2.index: 

     df1.ix[ID,'DecisionDate'] = df2.ix[ID,'DecisionDate'] 

作品。

for ID in df2.index: 

     df1.ix[ID,'DecisionDate'] = df2.ix[ID,'DecisionDate']# some comment 

スパイダーは、右隣のアクティブコードにされたコメントのハッシュを好きではなかった:私は行の後に持っていたし、コメントアウト何

以下の通りでした。単一の値を取る代わりに、df2.ix[ID,'DecisionDate']# some commentはタプル(myvalue,)に変換され、タイプエラーが発生しました。その行からコメントを削除するとすぐに、それはうまくいきました。

0

私は問題がNATタイプを識別していたと考えています。 これは動作します:

def identify_null(r): 
     x = r['ID'] 
     X = df2.loc[df2.ID == x]['date'] #collect date from other dataframe 
     if type(r['date']) == pd.tslib.NaTType: 
      return X #intended value from the other data table 
     return r['date'] 

    df['date'] = df.apply(identify_null, axis=1) 

EDIT:以前、私が提案した:周り 作品:欠損値を持つ行をドロップ を。

df2 = df[df.date.notnull()] 

をして考えてみます:

df1 = df[df.date.isnull()] 

DF1のため、日付の列を削除し、日付を持っているデータセットにマージそれはにnotnull検討しています。

frame = [df1_merged, df2] 
    df = pd.concat(frame) 

注:私はNaTをあまり試していないので申し訳ありません。しかし、これはあなたのために働くはずです。

+0

ありがとうございます。私たちは醜い回避策のゾーンに入っています。私は問題は扱いにくく、かなりエレガントな方法で処理しました。すべての操作を実行した後、いくつかのデータフレームをシャッフルする前に、私のdatetimeのenmasseを文字列に変換しました。 @Stephen Raushのような他の人が複製できないという事実に照らして、本当に厄介な問題です。 – Windstorm1981

+1

@ Windstorm1981編集を行いました。問題がpd.NaT(np.isnanを使用していますが、タイプが別のpandas objに設定されている)の識別にあった場合は、データのタイプに基づいて条件を設定するとうまくいきます。これが役に立つと思っていますか? – user2685079

関連する問題