2017-02-04 43 views
1

我有两个数组,即nlxTTLttlState。两个阵列都包含0和1的重复模式,表示可以是高电平(1)或低电平(0)的输入电压,并且从发送具有1秒脉冲宽度的TTL脉冲(高和低)的相同源记录。根据另外2个列表对齐2个python列表

但由于一些记录错误,在ttlState列表中发生了一些下降,即它不记录0和1的重复序列并且结束丢弃值。

好的部分是我也为每个列表收到的每个TTL输入的日志时间戳记。 Inter TTL事件时间戳差异清楚地表明TTL事件错过了其中一个脉冲。

这里是什么样的数据看起来像一个例子:

nlxTTL, ttlState, nlxTime, ttlTime 
0,0,1000,1000 
1,1,2000,2000 
0,1,3000,4000 
1,1,4000,6000 
0,0,5000,7000 
1,1,6000,8000 
0,0,7000,9000 
1,1,8000,10000 

正如你可以看到nlxTimettlTime清楚彼此不同。那么如何使用这些时间戳我可以对齐所有4个列表?

+0

为什么downvote?如果你能解释一下,这样可以提高问题质量 – raj

回答

4

在处理表格数据(如CSV文件)时,最好使用库来简化过程。我喜欢pandas数据帧库。

现在对于你的问题,考虑这个问题的一种方法是你真的有两个数据集...一个nlx数据集和一个ttl数据集。您想通过时间戳将这些数据集连接在一起。熊猫使得这样的任务变得非常简单。

import pandas as pd 
from StringIO import StringIO 

data = """\ 
nlxTTL, ttlState, nlxTime, ttlTime 
0,0,1000,1000 
1,1,2000,2000 
0,1,3000,4000 
1,1,4000,6000 
0,0,5000,7000 
1,1,6000,8000 
0,0,7000,9000 
1,1,8000,10000 
""" 

# Load data into dataframe. 
df = pd.read_csv(StringIO(data)) 

# Remove spaces from column names. 
df.columns = [x.strip() for x in df.columns] 

# Split the data into an nlx dataframe and a ttl dataframe. 
nlx = df[['nlxTTL', 'nlxTime']].reset_index() 
ttl = df[['ttlState', 'ttlTime']].reset_index() 

# Merge the dataframes back together based on their timestamps. 
# Use an outer join so missing data gets filled with NaNs instead 
# of just dropping the rows. 
merged_df = nlx.merge(ttl, left_on='nlxTime', right_on='ttlTime', how='outer') 

# Get back to the original set of columns 
merged_df = merged_df[df.columns] 

# Print out the results. 
print(merged_df) 

这产生了以下输出。

nlxTTL ttlState nlxTime ttlTime 
0  0.0  0.0 1000.0 1000.0 
1  1.0  1.0 2000.0 2000.0 
2  0.0  NaN 3000.0  NaN 
3  1.0  1.0 4000.0 4000.0 
4  0.0  NaN 5000.0  NaN 
5  1.0  1.0 6000.0 6000.0 
6  0.0  0.0 7000.0 7000.0 
7  1.0  1.0 8000.0 8000.0 
8  NaN  0.0  NaN 9000.0 
9  NaN  1.0  NaN 10000.0 

你会发现它在下降值填充与NaN值,因为我们在做外连接。如果不需要,请将how='outer'参数更改为how='inner'以执行内部连接。这将只保留您在该时间戳处具有nlx和ttl响应的记录。

+0

感谢你的回答。我应该开始更多地了解熊猫。虽然我注意到数据中的另一个条件。我将再次用一个例子来问它: \t'nlxTTL,ttlState,nlxTime,ttlTime' \t'0,0,1000,10' \t'1,1,2000,20' \t' 0,1,3000,40' \t'1,1,4000,60' \t'0,0,5000,70' \t'1,1,6000,80' \t'0, 0,7000,90' \t'1,1,8000,100' 如果nlxTime和ttlTime上的时钟以不同的时间开始,如上所示,如何对齐列表? – raj

+0

如果这篇文章回答了您的原始问题,最好结束这篇文章。如果你有一个你无法弄清楚的新问题,最好将它作为一个关于StackOverflow的新问题,这样每个人都有机会搜索并看到它。在发布一个新问题之前,问问你自己到目前为止已经尝试了什么,以及为什么这些事情没有奏效。然后包括你在下一个问题中尝试过的例子。 – lambdaman