2017-08-15 16 views
1

私はnullではないオブジェクトであり、timedeltaまたはdatetimeに変換できないTime列を持っています。私は()をdf.info入力すると、私は「時間」列がnull以外のオブジェクトであることだと私ははtimedeltaまたは日時に変換することができませんでした時間列をキャストし、python pandasで条件付きtimedeltaを見つける方法

 Time    msg 
12:29:36.306000  Setup 
12:29:36.507000  Alerting 
12:29:38.207000  Service 
12:29:39.194000  Setup 
12:30:05.773000  Alerting 
12:30:06.205000  Service 
12:32:07.315000  Setup 
12:32:17.194000  Service 
12:32:26.889000  Setup 
12:36:06.274000  Alerting 
12:36:08.523000  Service 
12:37:59.200000  Setup 
12:47:10.652000  Alerting 
12:47:43.921000  Setup 

(私が行うことができない理由は、このために、それは明らかですそれ)。ですから、連続するmsg(time delta)の違いを見つける解決策はありますが、timedeltaが<の場合は5秒です。 出力:

 Time    msg   diff 
12:29:36.306000  Setup   
12:29:36.507000  Alerting  
12:29:38.207000  Service 
12:29:39.194000  Setup 
12:30:05.773000  Alerting 
12:30:06.205000  Service 
12:32:07.315000  Setup 
12:32:17.194000  Service 
12:32:26.889000  Setup 
12:36:06.274000  Alerting 6.30*** 
12:36:08.523000  Service  
12:37:59.200000  Setup 
12:47:10.652000  Alerting 11.02***  
12:47:43.921000  Setup  

私はこのような何かを試してみた:

df['diff'] = (df['Time']df['Time'].shift()).fillna(0) 

しかし、私は5秒間隔のための条件を書くこと知りませんでした。

+0

'それがエラーを返す' DF [ '時間'] = pd.to_timedelta([ '時間'] DF)を使用する場合? – jezrael

+0

はい。 ValueError:timedeltaスカラーの型が無効です:> – jovicbg

+0

次に、 'df [' Time '] = pd.to_timedelta(df [' Time ']。astype(str))' – jezrael

答えて

1

私は最初にstrに変換してからto_timedeltaに電話する必要があると思います。

次にdiffを取得し、5sとコンパイルしてください。

マスクすることにより、新しい列の使用maskのための最終:

df['Time'] = pd.to_timedelta(df['Time'].astype(str)) 

df['diff'] = df['Time'].diff() 
df['mask'] = df['Time'].diff() > pd.Timedelta(5, unit='s') 
print (df) 
       Time  msg   diff mask 
0 12:29:36.306000  Setup    NaT False 
1 12:29:36.507000 Alerting 00:00:00.201000 False 
2 12:29:38.207000 Service 00:00:01.700000 False 
3 12:29:39.194000  Setup 00:00:00.987000 False 
4 12:30:05.773000 Alerting 00:00:26.579000 True 
5 12:30:06.205000 Service 00:00:00.432000 False 
6 12:32:07.315000  Setup 00:02:01.110000 True 
7 12:32:17.194000 Service 00:00:09.879000 True 
8 12:32:26.889000  Setup 00:00:09.695000 True 
9 12:36:06.274000 Alerting 00:03:39.385000 True 
10 12:36:08.523000 Service 00:00:02.249000 False 
11 12:37:59.200000  Setup 00:01:50.677000 True 
12 12:47:10.652000 Alerting 00:09:11.452000 True 
13 12:47:43.921000  Setup 00:00:33.269000 True 

df['Time'] = pd.to_timedelta(df['Time']) 
diff = df['Time'].diff() 
mask = df['Time'].diff() > pd.Timedelta(5, unit='s') 
df['new'] = diff.where(mask) 
print (df) 
       Time  msg    new 
0 12:29:36.306000  Setup    NaT 
1 12:29:36.507000 Alerting    NaT 
2 12:29:38.207000 Service    NaT 
3 12:29:39.194000  Setup    NaT 
4 12:30:05.773000 Alerting 00:00:26.579000 
5 12:30:06.205000 Service    NaT 
6 12:32:07.315000  Setup 00:02:01.110000 
7 12:32:17.194000 Service 00:00:09.879000 
8 12:32:26.889000  Setup 00:00:09.695000 
9 12:36:06.274000 Alerting 00:03:39.385000 
10 12:36:08.523000 Service    NaT 
11 12:37:59.200000  Setup 00:01:50.677000 
12 12:47:10.652000 Alerting 00:09:11.452000 
13 12:47:43.921000  Setup 00:00:33.269000 
+0

を使用します。質問 - 多分はい、多分新しいトピックを作成する必要はありません。 – jezrael

+0

あなたが気にしないなら、私はもう一つの要望を持っています。新しいQトピックを作成できます。 どうすれば5秒の条件を使用しなければならないのですが、msgの2つの 'Setup'値を 'Alerting'値なしで使用するだけです。警告がメッセージの2つの設定値の間にある場合、それは通常のようにtimedeltaを計算するだけです。 たとえば、7行目と8行目はコード内でNaTになりますが、他の行はtimedeltaになります。 – jovicbg

+0

それほど簡単ではないようですが、新しい質問を作成することができます。なぜ '6,7,8'行が選ばれないのですか? – jezrael

関連する問題