2015-08-25 328 views
2

我從三個完全不同的傳感器源獲取時間序列數據作爲CSV文件,並且希望將它們合併爲一個大的CSV文件。 我已經設法使用numpy的genfromtxt將它們讀入numpy,但我不確定要從這裏做什麼。使用numpy/pandas按時間戳合併時間序列數據

基本上,我已經是這樣的:

表1:

timestamp val_a val_b val_c 

表2:

timestamp val_d val_e val_f val_g 

表3:

timestamp val_h val_i 

所有時間戳是UNIX毫秒t imestamps爲numpy.uint64。

而我想要的是:

timestamp val_a val_b val_c val_d val_e val_f val_g val_h val_i 

...其中所有數據合併,並通過時間戳排序。三個表格中的每一個都已按時間戳排序。 由於數據來自不同的來源,因此不能保證來自表1的時間戳也將在表2或3中,反之亦然。在這種情況下,空值應該標記爲N/A。

到目前爲止,我用熊貓來轉換數據,像這樣嘗試:

df_sensor1 = pd.DataFrame(numpy_arr_sens1) 
df_sensor2 = pd.DataFrame(numpy_arr_sens2) 
df_sensor3 = pd.DataFrame(numpy_arr_sens3) 

,然後使用pandas.DataFrame.merge試過,但我敢肯定,這將不適合什麼工作,我現在想做。任何人都可以將我指向正確的方向嗎?

+1

你能告訴它應該工作你試着用'merge',例如,如果你做了'合併= pd.merge(df_sensor1,df_sensor_2,上= '戳')',然後重複'df_seonsor3',或者如果你設置索引爲所有dfs的時間戳,那麼你可以只做'pd.concat([df_sensor_1,df_seonsor2,df_sensor3])' – EdChum

+0

謝謝你的快速回答!我完全像你寫的那樣使用了'merge',但是顯然做了一個內部連接,所以只有在所有表中有時間戳的數據點被寫入到合併表中。我嘗試了一個外連接,它包含了所有的數據,但也沒有獲得訂購權。 雖然我只是嘗試'concat'。我做了'merged = pd.concat([df_sensor1,df_sensor2,df_sensor3],axis = 1)'和'merged.to_csv('out.csv',sep =';',header = True,index = True,na_​​rep = '不適用')'這似乎已經完成了這項工作。我將不得不在明天進行驗證。 – vind

回答

3

我認爲,你可以簡單地

  • 定義timestamp每個DataFrame(使用​​)
  • 使用join他們與'outer'法合併的index
  • Optionnaly轉換timestampdatetime

他re就是它的樣子。

# generating some test data 
timestamp = [1440540000, 1450540000] 
df1 = pd.DataFrame(
    {'timestamp': timestamp, 'a': ['val_a', 'val2_a'], 'b': ['val_b', 'val2_b'], 'c': ['val_c', 'val2_c']}) 
# building a different index 
timestamp = timestamp * np.random.randn(abs(1)) 
df2 = pd.DataFrame(
    {'timestamp': timestamp, 'd': ['val_d', 'val2_d'], 'e': ['val_e', 'val2_e'], 'f': ['val_f', 'val2_f'], 
    'g': ['val_g', 'val2_g']}, index=index) 
# keeping a value in common with the first index 
timestamp = [1440540000, 1450560000] 
df3 = pd.DataFrame({'timestamp': timestamp, 'h': ['val_h', 'val2_h'], 'i': ['val_i', 'val2_i']}, index=index) 

# Setting the timestamp as the index 
df1.set_index('timestamp', inplace=True) 
df2.set_index('timestamp', inplace=True) 
df3.set_index('timestamp', inplace=True) 

# You can convert timestamps to dates but it's not mandatory I think 
df1.index = pd.to_datetime(df1.index, unit='s') 
df2.index = pd.to_datetime(df2.index, unit='s') 
df3.index = pd.to_datetime(df3.index, unit='s') 

# Just perform a join and that's it 
result = df1.join(df2, how='outer').join(df3, how='outer') 
result 

result

+0

如果你使用這個解決方案並且有許多表(或者它們有一個未知的動態數量),那麼可以在'reduce'函數中加入'join'操作,這意味着更少的代碼。另外,我相信'pandas.merge()'將概括上面使用的'join()'方法。首先,'from functools import reduce',then'result = reduce(lambda left,right:pd.merge(left,right,left_on ='timestamp',right_on ='timestamp',how ='outer'),df_list)'' - 最後一個參數'df_list'是你的DataFrame的列表,例如'df_list = [df1,df2,df3,...,df_n]'。 –

相關問題