【问题标题】:How to plot pandas dataframe in 24 hour intervals? (multiple plots)如何以 24 小时为间隔绘制熊猫数据框? (多个地块)
【发布时间】:2019-09-27 11:48:12
【问题描述】:

我有一个大约 3 年的 pandas 数据框,分辨率为 6 秒,我想将数据分组到 24 小时的 bin 中并每天绘制 在循环中使用 matplotlib。 这是我的数据框的头部:

  timestamp                    consumption
0 2012-11-11 12:00:03          468
1 2012-11-11 12:00:09          476
2 2012-11-11 12:00:16          463
3 2012-11-11 12:00:22          449
4 2012-11-11 12:00:28          449 

它包括一个房子从 2012 年到 2015 年的耗电量。经过预处理后,数据帧从第一天下午 12 点左右开始。我需要以 24 小时为间隔绘制所有数据帧,并且每个图必须代表一天,从大约 12 点开始,到第二天大约 12 点结束

所以,我需要大约 1500 个图来显示每天从下午 12 点开始我的数据帧大约 1500 天的功耗。

提前致谢。

更新: 我想分别绘制 1500 天的原因是我想检查每晚的电力消耗并标记居住者的睡眠模式。我认为每天从 12 点到 12 点在一个地块中有一个完整的睡眠周期。在准备好标签后,我将能够将它们用作分类的训练和测试数据

【问题讨论】:

  • 你需要1500个地块(图/图片)?
  • @QuangHoang 完全正确

标签: python-3.x pandas dataframe matplotlib time


【解决方案1】:

这是一个奇怪的要求。如果我们知道您的最终目标是什么,可能会更容易理解,但我假设您想要绘制并保存每一天的数字。

df['day'] = (df['timestamp'] + pd.Timedelta('12h')).dt.date
for day in df['day'].unique():
    mask = (df['day'] == day)
    #<the code for the plot that you want>
    plt.plot(x=df[mask]['timestamp'].dt.time,y=df[mask]['consumption'])
    plt.savefig('filename'+str(day)+'.png')
    plt.close()

【讨论】:

  • 非常感谢您回答我的问题。我更新了我的问题,并解释了为什么我需要单独 1500 个地块。我试过你的代码,但它保存了空图。
  • 代码生成多少个图?您是否尝试过单独使用过滤器?例如。只需输入 df[mask] 并检查输出。
  • 我想我知道可能发生了什么,上面的编辑可能会解决它。
  • 保存 130 个图后,我停止了该过程。因为它节省了空地。它从 filename2012-11-11.png 保存到 filename2013-04-16.png。但即使绘图不为空,您的代码也会根据日期逐日绘制。因此,数据将在每个图中从 00:00:00 到 23:59:59 绘制。但我需要从 12 点到 12 点的日子。
  • 添加了更多内容以满足其他要求。 Day 现在应该是 12 小时的时间偏移量。
【解决方案2】:

认为这不仅是一个答案,也是一个建议。首先,将'timestamp'列转换为索引(DatetimeIndex)

df.set_index(df['timestamp'], inplace=True, drop=True)

然后,获取 DataFrame 中发生的所有独特日期

unique_days = list(set(df.index.to_period('D').strftime('%Y-%m-%d')))

然后我们将 DataFrame 压缩成一个系列

del df['timestamp']
df = df.squeeze()

现在,只需在单独的子图中绘制系列中独特的日子。

import matplotlib.pyplot as plt

unique_days = list(set(df.index.to_period('D').strftime('%Y-%m-%d')))
fig, axes = plt.subplots(nrows=len(unique_days), ncols=1)

row = 0
for day in unique_days:
    df[day].plot(ax=axes[row], figsize=(50,10))
    row += 1

plt.show()

现在,您可以尝试使用plots 的参数,以便根据需要自定义它们。

【讨论】:

  • 感谢您回答我的问题。我更新了我的问题,并解释了为什么我需要单独 1500 个地块。我尝试了您的建议,但收到此错误:ValueError: view limit minimum -36559.54999826389 is less than 1 and is a invalid Matplotlib date value。如果您将非日期时间值传递给具有日期时间单位的轴,这通常会发生
  • 我明白了。你能显示 df.head() 的输出吗?我怀疑 df['timestamp'] 列没有被删除。试试修改后的版本。
  • 我将 plot.show() 添加到循环的最后一行。它策划了,但不是一天。持续了好几天。
  • @Arash.Ch - 请检查我的答案的新版本是否是您正在寻找的。如果是,请标记为已接受的答案。干杯
猜你喜欢
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2020-07-28
  • 2016-05-16
  • 2017-10-10
  • 1970-01-01
相关资源
最近更新 更多