2017-08-03 7 views
0

私は以下のようなdfの外観を持っていますが、はるかに大きいです。 lastDateの列の下に不正確な日付がいくつかありますが、correctDate列のすぐ隣に何かがある場合にのみ間違っています。forループのパンダを使用して日時の値を置換する

dff = pd.DataFrame(
      {"lastDate":['2016-3-27', '2016-4-11', '2016-3-27', '2016-3-27', '2016-5-25', '2016-5-31'], 
      "fixedDate":['2016-1-3', '', '2016-1-18', '2016-4-5', '2016-2-27', ''], 
      "analyst":['John Doe', 'Brad', 'John', 'Frank', 'Claud', 'John Doe'] 
      }) 

enter image description here

enter image description here 日時dtypesにこれらの列を変換

答えて

1

最初のループ後の最初の一つは、私が持っているもので、もう一つは、私が持っているしたいものです。

for col in ['fixedDate', 'lastDate']: 
    df[col] = pd.to_datetime(df[col]) 

次に使用可能

たとえば
mask = pd.notnull(df['fixedDate']) 
df.loc[mask, 'lastDate'] = df['fixedDate'] 

私は私の本当のデータセットにマスクを適用すると、

import pandas as pd 

df = pd.DataFrame({"lastDate":['2016-3-27', '2016-4-11', '2016-3-27', '2016-3-27', '2016-5-25', '2016-5-31'], "fixedDate":['2016-1-3', '', '2016-1-18', '2016-4-5', '2016-2-27', ''], "analyst":['John Doe', 'Brad', 'John', 'Frank', 'Claud', 'John Doe'] }) 

for col in ['fixedDate', 'lastDate']: 
    df[col] = pd.to_datetime(df[col]) 

mask = pd.notnull(df['fixedDate']) 
df.loc[mask, 'lastDate'] = df['fixedDate'] 
print(df) 

利回り

analyst fixedDate lastDate 
0 John Doe 2016-01-03 2016-01-03 
1  Brad  NaT 2016-04-11 
2  John 2016-01-18 2016-01-18 
3  Frank 2016-04-05 2016-04-05 
4  Claud 2016-02-27 2016-02-27 
5 John Doe  NaT 2016-05-31 
+0

は、それは同様にヌルとしてnull fixedDateですべてlastDateを作りました。それはサンプルdfには起こらなかった。これがなぜ起こっているのか? – Johnny

+0

私は、実際の日付に日付文字列を変換することは厳密には必要ではないと書いていましたが、今はそうではないことを認識しています。 '' fixedDate''が空の文字列である場合、 '' mask'はTrueになります。 '' p.notnull(['']) 'np.array([True])と等しくなります。 'fixedDate'が空の文字列であっても' df.loc [mask、 'lastDate'] = df ['fixedDate'] 'は' lastDate'を上書きします。これは、あなたが 'pd.to_datetime'を使って日付文字列を' datetime64'に変換しなかったと仮定して、あなたが見ている動作を説明するかもしれません。 – unutbu

関連する問題