gpt4 book ai didi

python - 以 timedelta 为条宽的条形图

转载 作者:太空狗 更新时间:2023-10-30 00:10:42 27 4
gpt4 key购买 nike

我有一个 pandas 数据框,其中一列包含时间戳 (start),另一列包含 timedeltas (duration) 以指示持续时间。

我正在尝试绘制一个条形图来显示这些持续时间,它们的左边缘位于时间戳处。我还没有在网上找到这样做的方法。有什么办法可以做到这一点?

到目前为止,这是我所拥有的,但不起作用:

    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)

最佳答案

如果您的 df.duration[0] 类型是 pandas.tslib.Timedelta 并且您的 timestamps 相隔几天,您可以使用:

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

这将生成图表。

否则使用 total_seconds 方法,如 this answer 中所述

更新:

如果数据是每小时的,时间增量以分钟为单位,那么获得所需图表的一种方法是这样的:

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

关于python - 以 timedelta 为条宽的条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26498627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com