2016-09-19 63 views
0

我有一個熊貓數據框在Python中有幾列和日期時間戳。其中一列有true/false變量。我想計算時間,直到該列是錯誤的。Python熊貓計算時間,直到輸出達到0

理想的情況下它會是這個樣子:

datetime    delivered secondsuntilfailure 
2014-05-01 01:00:00 True  3 
2014-05-01 01:00:01 True  2 
2014-05-01 01:00:02 True  1 
2014-05-01 01:00:03 False  0 
2014-05-01 01:00:04 True  ? 

在此先感謝!

+0

你試過了什麼嗎?你能告訴我們你的代碼嗎? – gabra

回答

0

你可以先通過[::-1]更改訂單,然後找diff和計數cumsum如果值是True

df = df[::-1] 
print (df.datetime.diff().astype('timedelta64[s]')) 
4 NaN 
3 -1.0 
2 -1.0 
1 -1.0 
0 -1.0 
Name: datetime, dtype: float64 

df['new'] = df.delivered.where(~df.delivered,df.datetime.diff().astype('timedelta64[s]')) 
       .cumsum().fillna(0).astype(int).mul(-1) 
df = df[::-1] 
print (df) 
      datetime delivered secondsuntilfailure new 
0 2014-05-01 01:00:00  True     3 3 
1 2014-05-01 01:00:01  True     2 2 
2 2014-05-01 01:00:02  True     1 1 
3 2014-05-01 01:00:03  False     0 0 
4 2014-05-01 01:00:04  True     ? 0 
+0

我得到以下錯誤:類型錯誤回溯在(最近的最後一次調用) () ----> 6個DF [ '新'] = df.Pffr_deliverysuccess 。(〜df.Pffr_deliverysuccess,df.DateTime.diff()。astype('timedelta64 [s]'))。cumsum()。fillna(0).astype(int).mul(-1) 7 df = df [:: - 1] 8打印(df) – Clover

+0

C:\ Users \ caljrr \ Anaconda2 \ lib \ site-packages \ pandas \ core \ generic.pyc in __invert __(self) 780 def __invert __(self): 781嘗試: - > 782 arr = operator.inv(_values_from_object(self)) 783 return self .__ array_wrap __(arr) 784除外: TypeError:錯誤的操作數類型爲一元〜:'float' – Clover

+0

你是如何工作的〜〜df.delivered'? – jezrael

0

數秒:

cumsecs = df.datetime.diff().astype('timedelta64[s]').cumsum().fillna(value=0.0) 

複製的累計值時交付失敗,填寫任何前面的值:

undeliv_secs = cumsecs.where(~df['delivered']).fillna(method='bfill') 

秒直到失敗只是兩者之間的差異:

df['secondsuntilfailure'] = undeliv_secs - cumsecs 
print(df) 
      datetime delivered secondsuntilfailure 
0 2014-05-01 01:00:00  True     3.0 
1 2014-05-01 01:00:01  True     2.0 
2 2014-05-01 01:00:02  True     1.0 
3 2014-05-01 01:00:03  False     0.0 
4 2014-05-01 01:00:04  True     NaN 
+0

我得到以下錯誤:ypeError回溯(最近通話最後一個) () 2 cumsecs = df.DateTime.diff()。astype('timedelta64 [s]')。cumsum()。fillna(value = 0.0) ----> 3 undeliv_secs = cumsecs.where(〜df [在__invert__中使用C:\ Users \ caljrr \ Anaconda2 \ lib \ site-packages \ pandas \ core \ generic.pyc。df ['Duration'] = undeliv_secs - cumsecs – Clover

+0

Pffr_deliverysuccess'])。fillna(method ='bfill') (self) 780 def __invert __(self): 781 try: - > 782 arr = operator.i NV(_values_from_object(個體經營)) 783回自我.__ array_wrap __(ARR) 784不同的是: 類型錯誤:爲一元〜壞數類型: '浮動' – Clover

+0

這聽起來像你Pffr_deliverysuccess是浮動。你應該創建一個新列,並將其轉換爲bool,並在where() – danio