2015-08-25 329 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]'。 –

相关问题