2014-10-22 63 views
4

我有一個熊貓數據框,其中包含時間戳的列(start),另一列包含timedeltas(duration)以指示持續時間。條形圖timedelta作爲條寬

我想繪製一個條形圖,顯示這些持續時間與他們的左邊緣在時間戳。我還沒有找到這樣做的在線。有什麼辦法可以做到這一點?

到目前爲止,這是我,這不工作:

height = np.ones(df.shape[0]) 
    width = [x for x in df['duration']] 
    plt.bar(left=df['start'], height=height, width=width) 

編輯: 我已經更新了寬度但是如下也沒有解決這個問題:

width = [x.total_seconds()/(60*1200) for x in df['duration']] 

我想知道是否datetime.timedelta對象可以在width使用,因爲datetime對象可以被用作x軸。如果不是,還有什麼替代方案?

編輯#2:

這可能不是確切的回答我的問題,但它解決了目的,我的初衷。因爲凡有興趣,這是我最後採取的方法(我用startduration使end爲了這個目的):

for i in range(df.shape[0]): 
     plt.axvspan(df.ix[i, 'start'], df.ix[i, 'end'], facecolor='g', alpha=0.3) 
     plt.axvline(x=df.ix[i, 'start'], ymin=0.0, ymax=1.0, color='r', linewidth=1) 
     plt.axvline(x=df.ix[i, 'end'], ymin=0.0, ymax=1.0, color='r', linewidth=1) 

回答

2

如果df.duration[0]的類型是pandas.tslib.Timedelta和你timestamps都相隔幾天,你可以使用:

width = [x.days for x in df.duration] 

這將產生圖表。

否則使用total_seconds方法,在this answer

更新概述:

如果數據是每小時在幾分鐘timedeltas然後一個有你想要的圖表方式是這樣的:

import datetime as dt 
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

dates = pd.date_range(start=dt.date(2014,10,22), periods=10, freq='H') 
df = pd.DataFrame({'start': dates, 'duration': np.random.randint(1, 10, len(dates))}, 
        columns=['start', 'duration']) 
df['duration'] = df.duration.map(lambda x: pd.datetools.timedelta(0, 0, 0, 0, x)) 
df.ix[1, 1] = pd.datetools.timedelta(0, 0, 0, 0, 30) # To clearly see the effect at 01:00:00 
width=[x.minutes/24.0/60.0 for x in df.duration] # mpl will treat x.minutes as days hense /24/60. 
plt.bar(left=df.start, width=width, height=[1]*df.start.shape[0]) 
ax = plt.gca() 
_ = plt.setp(ax.get_xticklabels(), rotation=45) 

這產生了這樣的一張圖表:

enter image description here

+0

謝謝。實際上,他們只有幾個小時或幾分鐘的時間,我用'total_seconds'看到了另一個答案,但它不起作用。原因是您必須將其縮放到小時和分鐘,但由於這些時間長度不同,因此縮放比例不準確,需要每次都手動調整。所以現在寬度是 'width = [x.total_seconds()/(60 * 1200)for df ['duration']] 由於'Pyplot'處理x軸的'datetime'對象,所以我是期待'datetime.timedelta'被識別和處理的寬度,我很驚訝它不是。 – oxtay 2014-10-22 16:29:29

+0

@oxtay是的,如果'matplotlib'本能地理解'bar'和'broken_barh'圖中的TimeDeltas或Offsets,那麼會更好,但在那之前我只看到了一些有點繁瑣的方法來實現你想要的。我已經更新了上面的帖子,以小時/分鐘的形式顯示示例 – Primer 2014-10-22 21:24:40

+0

@Primer請注意,由於缺少用於「日期」聲明的日期時間導入,因此無法正常使用。也有可能是某種熊貓版本的詭計,因爲我最終得到'numpy.timedelta64's,它們沒有與'datetime.timedelta's做的相同的方法... – Ajean 2014-10-22 23:22:25