2017-11-29 13 views
0

私はこのようになり、データフレームを持って引くことによって、それを更新します。列の値がNATである場合、2つの日付

enter image description here

私がやろうとしています何がdays_diffがnumpyのを使用するNATであるかどうかを確認していますそれがNaTならば、outofservicedatetimeによって "2016-01-01"を減算して更新します。以下のコード実行した後:私は日としてdays_diff値を持つことができますどのように

enter image description here

df[['days_diff']] = np.where(pd.isnull(df[['days_diff']]), df[['outofservicedatetime']] - np.datetime64('2016-01-01'), df[['days_diff']]) 

を私はこのような出力を得ますか?あるいは誰かがこれを達成するためのより簡単な方法を示唆することができれば、同様に役立つだろう。

答えて

0

私はあなたがto_timedeltaが必要だと思う:

df['days_diff'] = pd.to_timedelta(df['days_diff']) 

しかし、より良い条件で設定された値のためlocを使用している:

date = pd.to_datetime('2016-01-01') 
df.loc[df['days_diff'].isnull(), 'days_diff'] = df['outofservicedatetime'] - date 
print (df) 
    windturbineid outofservicedatetime subsystem days_diff 
0   wtg_11   2016-03-09 Transformer 68 days 
1   wtg_29   2016-03-14  Gearbox 73 days 
2   wtg_14   2016-03-22 Converter 81 days 
3   wtg_4   2016-03-25 Converter 84 days 
4   wtg_19   2016-03-30 Converter 89 days 
5   wtg_13   2016-04-05  Yawing 95 days 
6   wtg_9   2016-05-04 Converter 124 days 
7   wtg_15   2016-05-24 Converter 144 days 
8   wtg_7   2016-05-25 Converter 145 days 
9   wtg_22   2016-05-30 Generator 150 days 
10   wtg_2   2016-05-31 Converter 151 days 
11   wtg_1   2016-06-29 Converter 180 days 
12   wtg_1   2016-07-11 Generator 192 days 
13  wtg_14   2016-07-17 Converter 117 days 
14   wtg_7   2016-08-11 Converter 78 days 
15  wtg_14   2016-08-22 Transformer 234 days 
16   wtg_7   2016-08-25  Yawing 237 days 
0

あなたが使用してここに[df.loc[df['days_diff'].isnull()...にわたって2つの速度向上の要因について取得することができますpd.Series.fillna、場合によっては 'inplace = True'という引数を使用して、動作を複製する場合はdf.locとなります。

date = pd.Timestamp('20160101') 

df = pd.date_range('20160301', '20160831', freq='7D').to_series().reset_index() 

df[0] = [pd.Timedelta('nat')]*25+[pd.Timedelta(days=99), pd.Timedelta(days=45)] 

df.columns = ['outofservicedatetime', 'days_diff'] 

df 
Out[258]: 
    outofservicedatetime days_diff 
0   2016-03-01  NaT 
1   2016-03-08  NaT 
2   2016-03-15  NaT 
3   2016-03-22  NaT 
4   2016-03-29  NaT 
5   2016-04-05  NaT 
6   2016-04-12  NaT 
7   2016-04-19  NaT 
8   2016-04-26  NaT 
9   2016-05-03  NaT 
10   2016-05-10  NaT 
11   2016-05-17  NaT 
12   2016-05-24  NaT 
13   2016-05-31  NaT 
14   2016-06-07  NaT 
15   2016-06-14  NaT 
16   2016-06-21  NaT 
17   2016-06-28  NaT 
18   2016-07-05  NaT 
19   2016-07-12  NaT 
20   2016-07-19  NaT 
21   2016-07-26  NaT 
22   2016-08-02  NaT 
23   2016-08-09  NaT 
24   2016-08-16  NaT 
25   2016-08-23 99 days 
26   2016-08-30 45 days 


%timeit df['days_diff'].fillna(df['outofservicedatetime']-date) 
1.29 ms ± 41.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

df['days_diff'].fillna(df['outofservicedatetime']-date) 
Out[260]: 
0  60 days 
1  67 days 
2  74 days 
3  81 days 
4  88 days 
5  95 days 
6 102 days 
7 109 days 
8 116 days 
9 123 days 
10 130 days 
11 137 days 
12 144 days 
13 151 days 
14 158 days 
15 165 days 
16 172 days 
17 179 days 
18 186 days 
19 193 days 
20 200 days 
21 207 days 
22 214 days 
23 221 days 
24 228 days 
25 99 days 
26 45 days 
Name: days_diff, dtype: timedelta64[ns] 
%timeit df.loc[df['days_diff'].isnull(), 'days_diff'] = df['outofservicedatetime'] - date 
2.46 ms ± 106 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 
関連する問題