2015-07-11 75 views
1

所以我基於一個簡單的數據陣列上的代碼看起來像這樣的繪製日期時間輸出:使用matplotlib

5020 : 2015 7 11 11 42 54 782705 
    5020 : 2015 7 11 11 44 55 575776 
    5020 : 2015 7 11 11 46 56 560755 
    5020 : 2015 7 11 11 48 57 104872 

,情節如下所示:

import scipy as sp 
    import matplotlib.pyplot as plt 
    data = sp.genfromtxt("E:/Python/data.txt", delimiter=" : ") 
    x = data[:,0] 
    y = data[:,1] 
    plt.scatter(x,y) 
    plt.title("Instagram") 
    plt.xlabel("Time") 
    plt.ylabel("Followers") 
    plt.xticks([w*2*60 for w in range(10)], 
    ['2-minute interval %i'%w for w in range(10)]) 
    plt.autoscale(tight=True) 
    plt.grid() 
    plt.show() 

我期待對於一個簡單的方法來使用日期時間輸出作爲圖表上的x間隔,我找不出一種方法來讓它理解它,這裏有:

In [15]:sp.sum(sp.isnan(y)) 
    Out[15]: 77 

我猜這是因爲空間?我是Python新機器學習新手,原諒我的無知。

非常感謝。

回答

0

是的,這是因爲空間。當您導入數據時,它會將NaN分配給您的x值。

試試這個,這是長一點,但應該工作:

data = [] 
x=[] 
y=[] 

with open('data.txt', 'r') as f: 
    for line in f: 
     data.append(line.split(':')) 

for i in data: 
y.append(i[0]) 
x_old.append(i[1]) 

for t in x_old: 
    x.append(float(t[17:19]+'.'+t[20:])/60+int(t[14:16])) 

因爲空間,我不得不將數據手動轉換爲浮動。我把秒數+毫秒除以60,然後加上分鐘數,因爲我假設你只對那個(2分鐘間隔)感興趣。

如果格式更好,您可以使用datetime並更好地提取信息。例如:

my_time = datetime.strptime('2015 7 11 11 42 54.782705', '&Y &m %d %H:%M:%S.%f') 
+0

我嘗試這樣做,得到了:ValueError異常:無效字面浮法():2015年7 11 11 42 54 782705 編輯:這是因爲一個不可打印字符'\ n' –

+0

好吧,那麼我編輯我的帖子,認爲這是另一個轉換因素。很高興它的工作。 – Leb

1

我會通過直接將datetime.datetime對象傳遞給pyplot來解決這個問題。下面是一個簡單的例子:

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

# Note: please figure out yourself the data input 
x  = [dt.datetime(2015,7,11,11,42,54), 
    dt.datetime(2015,7,11,11,44,56), 
    dt.datetime(2015,7,11,11,46,56), 
    dt.datetime(2015,7,11,11,48,57)] 

#define the x limit: 
xstart= dt.datetime(2015,7,11,11,40,54) 
xstop = dt.datetime(2015,7,11,11,50,54) 


y  = [782705, 575776, 560755, 104872] 

fig,ax= plt.subplots() 
ax.scatter(x,y) 
xfmt = matplotlib.dates.DateFormatter('%D %H:%M:%S') 
ax.xaxis.set_major_formatter(xfmt) 
ax.set_title("Instagram") 
ax.set_xlabel("Time") 
ax.set_ylabel("Followers") 
ax.set_xlim(xstart,xstop) 
plt.xticks(rotation='vertical') 
plt.show() 

結果: enter image description here