2017-06-20 51 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'字符串生成一個行列表。 –