2017-06-12 59 views
1

如果我使用下面的代碼並打印x是什麼,我會得到1900,1,1,10,29,34的每個時間戳,我有一定的時間寫成hh:mm:ss格式。我怎樣才能拿走年月日?因爲我想以格式hh:mm:ss在Python中使用datetime

有時間編輯:更新整個代碼,因爲它現在看起來來自評論的幫助。

import matplotlib.pyplot as plt 
import matplotlib.ticker 
import time 
import datetime 

x = ['10:29:55', '10:34:44']   
sy1 = [679.162, 679.802] 

x_labels = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in x] 
formatter = matplotlib.ticker. FixedFormatter(x_labels) 
plt.gca().xaxis.set_major_formatter(formatter) 
plt.gca().xaxis.set_minor_formatter(formatter) 

plt.plot(x_labels, sy1, 'ro') 
plt.xlabel('Time') 
plt.ylabel('Position') 
plt.show() 

但顯然它也顯示了考慮到年份,月份和日期的時間。

Plotting (wrong) time against y values

如果我使用strptime的strftime的,而不是我得到一個類型錯誤:描述信息的strftime'需要 'datetime.date' 對象,但收到了 'STR'

+0

那麼,解析日期時間的問題,還是與情節?分開這兩件事並獨立解決它們。 – deceze

+0

嘗試'plt.plot(x,y)'。 x和y已經是列表,matplotlib在這種情況下不需要2d列表。 – vroomfondel

+0

您的編輯已將對圖像的引用刪除。你想使用matplotlib繪圖嗎?您可能需要https://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure.autofmt_xdate。如果你可以編輯你正在使用的圖庫,你可能會讓人願意回答。 –

回答

0

確定。有幾種方法可以得到你想要的東西。

如果你願意接受有微秒,你應該非常接近你所需要的:

import matplotlib.pyplot as plt 
import datetime 

time_strings = ['10:29:55', '10:34:44']   
sy1 = [679.162, 679.802] 

times = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in time_strings] 
plt.plot(times, sy1, 'ro') 
plt.xlabel('Time') 
plt.ylabel('Position') 
plt.show() 

這應該表現出你想要的時間在一個情節,只是在格式微秒。微秒使它變得很難看,但我唯一的變化是爲了清晰起見 - 我沒有import timeimport matplotlib.ticker,我將x更改爲更準確的變量名,並創建了日期時間。爲了擺脫微秒,事情變得更加醜陋。您不能只使用FixedFormatter,因爲我們只設置了2個值,而標準圖有2個以上的滴答;你必須找到讓FuncFormatter工作的方法。這可以按需要工作,但仍然太嘈雜,所以我也加入plt.gcf().autofmt_xdate()

import matplotlib.pyplot as plt 
import matplotlib.ticker 
import datetime 
import pylab 

time_strings = ['10:29:55', '10:34:44']   
sy1 = [679.162, 679.802] 

times = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in time_strings] 
plt.plot(times, sy1, 'ro') 
formatter = matplotlib.ticker.FuncFormatter(lambda tick_value, _: datetime.datetime.strftime(pylab.num2date(tick_value), '%H:%M:%S')) 
plt.gca().xaxis.set_major_formatter(formatter) 
plt.gca().xaxis.set_minor_formatter(formatter) 
plt.xlabel('Time') 
plt.ylabel('Position') 
plt.gcf().autofmt_xdate() 
plt.show() 

定義FuncFormatter的行很混亂。我定義了一個lambda函數,它是一行中定義的函數。 FuncFormatter預計它需要2個參數。第一個是tick_value,我們並不在乎第二個是什麼,所以我給它一個標準變量名稱_以表明我們不關心。刻度值是日期時間或時間戳。我們從tick值到datetime的方式是通過調用pylab.num2date。

你會發現這第二個解決方案正是你所需要的。你需要做的關鍵是跟蹤你的變量類型是什麼,以及需要哪些變量類型。

+0

謝謝。你的意思是plt.gca()?不幸的是,我得到一個情節,其中x的值出現像1900-01-01 10:29:34,所以我仍然需要擺脫那些年/月/日期戳。我借用你的最後一個代碼,我不想完全改變我的舊版本:) – Ofinns

+0

我更新了整個代碼,並且正如我在第一篇文章中寫到的(剛纔),如果使用strftime,我會得到一個TypeError 。對不起,我真的是一個新手。 – Ofinns

+0

感謝您添加所有代碼。 :-)將來,請從一開始就這樣做。我會重寫我的回答,以反映你現在告訴我們的情況。 –