2017-06-20 59 views
0

编辑只提取特定的列:作为建议缩短的问题:绘制在Python从CSV

很新的蟒蛇和编程,我想第1和第4列绘制成数(x)的日志(y)图。说实话,我不知道如何从中提取我需要的两列。

16:58:58 | 2.090 | 26.88 | 1.2945E-9 | 45.8 
16:59:00 | 2.031 | 27.00 | 1.3526E-9 | 132.1 
16:59:02 | 2.039 | 26.90 | 1.3843E-9 | 178.5 
16:59:04 | 2.031 | 26.98 | 1.4628E-9 | 228.9 
16:59:06 | 2.031 | 27.04 | 1.5263E-9 | 259.8 
16:59:08 | 2.027 | 26.84 | 1.6010E-9 | 271.8 
+0

使用'pandas'库将大大简化你的生活! – nbeuchat

+0

欢迎来到SO:请参加[旅游]。你应该把这两个问题分成两个单独的问题。首先,也许你想让数据保持正确的形状。那么你想担心绘制它。 –

+0

@nbeuchat现在看看它现在看起来不错。 –

回答

0

使用熊猫:

import pandas as pd 
df = pd.read_csv("data.txt", delimiter="\s[|]\s+", header=None, index_col=0) 
df.plot(y=4) 

enter image description here

(请注意,这忽略了对数缩放,因为它不是明确的时间的对数应该是多少)

+0

呵呵对不起,我没有评论时间的日志,因为我认为这是一个笑话。日志不是16点,而是在[s]中翻译成$ \ Delta t $,然后是$ log(\ Delta t)$。但我认为我可以做到这一步。 –

0

如果你不想使用优秀的pandas,这里是一种蒸汽方式。

import matplotlib.pyplot as plt 
import math 
import datetime as dt 

test = """16:58:58 | 2.090 | 26.88 | 1.2945E-9 | 45.8\n 
16:59:00 | 2.031 | 27.00 | 1.3526E-9 | 132.1\n 
16:59:02 | 2.039 | 26.90 | 1.3843E-9 | 178.5\n 
16:59:04 | 2.031 | 26.98 | 1.4628E-9 | 228.9\n 
16:59:06 | 2.031 | 27.04 | 1.5263E-9 | 259.8\n 
16:59:08 | 2.027 | 26.84 | 1.6010E-9 | 271.8\n""" 

lines = [line for line in test.splitlines() if line != ""] 

# Here is the real code 
subset = [] 

for line in lines: 
    parts = line.split('|') 
    ts = dt.datetime.strptime(parts[0].strip(), "%H:%M:%S") 
    num = math.log(float(parts[3].strip())) 
    subset.append((ts, num)) 

# now there is a list of tuples with your datapoints, looking like 
# [(datetime.datetime(1900, 1, 1, 16, 58, 58), 1.2945E-9), (datetime.datetime(1900, 1, 1, 16, 59), ...] 
# I made this list intentionally so that you can see how one can gather everything in a tidy way from the 
# raw string data. 

# Now lets separate things for plotting 
times = [elem[0] for elem in subset] 
values = [elem[1] for elem in subset] 

# now to plot, I'm going to use the matplotlib plot_date function. 
plt.figure() 
plt.plot_date(times, values) 
# do some formatting on the date axis 
plt.gcf().autofmt_xdate() 
plt.show() 

A plot!

+0

我不确定什么 'line = [line for test.splitlines()if line!=“”]' does –

+0

它不会影响您的解决方案。它是一种将测试数据块转换为模仿文件中readline的格式的机制。你只需要在'真正的代码'注释下面担心。也就是说,它会从'te​​st'字符串生成一个行列表。 –