2016-08-04 70 views
1

我想讀取一個csv文件並將此文件存儲在pandas數據框中,之後我想檢查一列值是否等於常量變量,並且相同的行應保存在單獨的數據框中。如何更新python中熊貓數據框的特定列中的所有行?

下一步是從單獨的數據框中更新一列。在這一步中,我遍歷整個數據框並更新特定列的所有行,所以它會花費太多時間,因爲我的數據框有成千上萬行。

Input.csv-

line_no,time 
205,1467099122677889 
205,1467099122677889 
206,1467099363719028 
207,1467099363818373 
207,1467099363918360 
208,1467099363818373 
210,1467099363958749 

計劃 -

import pandas as pd 

if __name__ == "__main__": 

    file_path = 'Input.csv' 
    input_line_no = 205 

    pd_dataframe = pd.read_csv(file_path,delimiter=',',keep_default_na=False) 
    match_df = pd.DataFrame(pd_dataframe.loc[pd_dataframe['line_no'] == int(input_line_no)]) 

    if match_df.empty: 
     print 'Given line no is not present in dataframe.' 
     sys.exit(1) 
    match_df = match_df.applymap(str) 
    for index in range(0,len(match_df.index)): 

     epoch_time = match_df.iloc[index]['time'] 
     stamp = int(str(epoch_time)+'0') 
     date = datetime.datetime.fromtimestamp(stamp/10000000.0).strftime('%H:%M:%S %f')[:-3] 
     match_df['time'].apply(str) 
     match_df.iloc[index]['time'] = date 

    print match_df.to_csv(index=False) 

此時間列是在信號出現時間我想將其轉換成所述人類可讀的時間戳,以便邏輯是針對僅用於目的。

但是我面臨着這個任務的執行時間問題。 有更快的方式更新現有數據框的列嗎?

+0

如果使用'日期= datetime.datetime.fromtimestamp(蓋章/ 10000000.0)'它返回'2434年11月27日04:20:26.778889'。這樣對嗎?或者它是'2016-06-28 07:32:02'? – jezrael

+0

@jezrael - 是的,這是正確的,不用擔心。我只想知道如何減少數據幀更新列的執行時間? – kit

回答

1

IIUC你可以先使用:

match_df = pd_dataframe[pd_dataframe['line_no'] == int(input_line_no)].copy() 
print (match_df) 
    line_no    time 
0  205 1467099122677889 
1  205 1467099122677889 

您可以使用apply,因爲timestamp limitations

在[55]:pd.Timestamp.max
出[55]:時間戳( '2262年4月11日23:47:16.854775807')

match_df['time'] = match_df.time 
          .apply(lambda x: datetime.datetime.fromtimestamp(int(str(x)+'0') 
           /10000000.0)) 
print (match_df) 
    line_no      time 
0  205 2016-06-28 09:32:02.677889 
1  205 2016-06-28 09:32:02.677889 

然後:

match_df['time'] = match_df.time 
          .apply(lambda x: datetime.datetime.fromtimestamp(int(str(x)+'0') 
           /10000000.0).strftime('%H:%M:%S %f')[:-3]) 
print (match_df) 
    line_no   time 
0  205 09:32:02 677 
1  205 09:32:02 677 
+0

對不起,我不確定將epoch_time轉換爲datetime。我的輸出是否正確? – jezrael

+0

@ jezrael-這個腳本是否將正確的行時間插入正確的位置?因爲在csv文件中,所有時間都不相同,所以有必要將特定行的時間更改爲人類可讀的時間戳並僅放置在該位置? – kit

+0

將時代轉換爲人類可讀的時間戳我的邏輯很好,因爲有一些要求,我可以把我的邏輯轉換爲人類時間戳在你的代碼中嗎?如果是,那麼如何? – kit

相關問題