python - 如何在 Pandas 中的 "day period"上覆盖数据以进行绘图

标签 python python-2.7 pandas matplotlib plot

我有一个 DataFrame,其中包含以下形式的一些(更有意义的)数据:

In[67] df
Out[67]: 
                             latency
timestamp                           
2016-09-15 00:00:00.000000  0.042731
2016-09-15 00:16:24.376901  0.930874
2016-09-15 00:33:19.268295  0.425996
2016-09-15 00:51:30.956065  0.570245
2016-09-15 01:09:23.905364  0.044203
                             ...
2017-01-13 13:08:31.707328  0.071137
2017-01-13 13:25:41.154199  0.322872
2017-01-13 13:38:19.732391  0.193918
2017-01-13 13:57:36.687049  0.999191

所以它跨越了大约 50 天,并且时间戳不是每天都在同一时间。我想为每一天叠加一些图,即在同一图上检查每一天的时间序列。 50 天可能是太多的线,但我认为有一种“每日季节性”,我想调查,这似乎是更严格的前一个有用的可视化。

如何将这些数据叠加在表示“单日”时间段的同一个图上 ?

我的想法

我对 Pandas 还不是很熟悉,但我设法将我的数据分组到每日垃圾箱中
In[67]: df.groupby(pd.TimeGrouper('D'))
Out[68]: <pandas.core.groupby.DataFrameGroupBy object at 0x000000B698CD34E0>

现在我一直在试图确定我应该如何创建一个新的 DataFrame 结构,以便可以按天覆盖这些图。这是我无法弄清楚的基本问题 - 我如何利用 DataFrameGroupBy 对象来覆盖图?一个非常基本的方法是只迭代每个 GroupBy 对象,但我这样做的问题是配置 x 轴,使其只显示独立于特定日期的“每日时间段”,而不是捕获整个时间戳。

将数据拆分为单独的帧,并使用某种日期强制在同一图中调用它们以使用方法 in this more general answer对我来说似乎不太好。

您可以类似地生成伪数据,如下所示:
import datetime 

start_date = datetime.datetime(2016, 9, 15)
end_date = datetime.datetime.now()

dts = []
cur_date = start_date
while cur_date < end_date:
    dts.append((cur_date, np.random.rand()))
    cur_date = cur_date + datetime.timedelta(minutes=np.random.uniform(10, 20))

最佳答案

考虑数据帧 df (主要由 OP 提供的代码生成)

import datetime 

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

start_date = datetime.datetime(2016, 9, 15)
end_date = datetime.datetime.now()

dts = []
cur_date = start_date
while cur_date < end_date:
    dts.append((cur_date, np.random.rand()))
    cur_date = cur_date + datetime.timedelta(minutes=np.random.uniform(10, 20))


df = pd.DataFrame(dts, columns=['Date', 'Value']).set_index('Date')

真正的技巧是将索引拆分为日期和时间组件并取消堆叠。然后插值以填补缺失值
d1 = df.copy()
d1.index = [d1.index.time, d1.index.date]
d1 = d1.Value.unstack().interpolate()

从这里我们可以d1.plot(legend=0)
ax = d1.plot(legend=0)
ax.figure.autofmt_xdate()

enter image description here

但这不是很有帮助。

你可以尝试这样的事情......希望这会有所帮助
n, m = len(d1.columns) // 7 // 4 + 1, 4
fig, axes = plt.subplots(n, m, figsize=(10, 15), sharex=False)

for i, (w, g) in enumerate(d1.T.groupby(pd.TimeGrouper('W'))):
    r, c = i // m, i % m
    ax = g.T.plot(ax=axes[r, c], title=w, legend=0)

fig.autofmt_xdate()

enter image description here

如何在数周内完成
  • 创建多索引
  • 包括代表周的周期
  • 包括星期几
  • 包括一天中的时间
  • unstack将每周时段放入列
  • 仍然不相信轴格式

  • d2 = df.copy()
    
    idx = df.index
    d2.index = [idx.weekday_name, idx.time, idx.to_period('W').rename('Week')]
    
    ax = d2.Value.unstack().interpolate().iloc[:, :2].plot()
    ax.figure.autofmt_xdate()
    

    enter image description here

    关于python - 如何在 Pandas 中的 "day period"上覆盖数据以进行绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41642799/

    相关文章:

    python - 通过 python 应用程序通过 gmail 发送电子邮件

    python - pandas 和 groupby : how to calculate weighted averages within an agg

    python - Pandas 并排堆积条形图

    python - 使用 matplotlib 的 set_array() 例程的指南是什么?

    python - 如何估计密度函数并计算其峰值?

    python - 如何使用 Python 替换字符串中的成对字符

    python - 无法在 ubuntu 中安装 pip 因此 pandas

    python - 基于Pandas数据帧的n列的唯一UUID(用于处理ElasticSearch上的重复项)

    python - 4个列表变成一个元组列表

    python - 使用 scrapy 缓冲项目和批量插入到 Mysql