如何在Pandas的“白昼时期”覆盖数据以进行绘图

我有一个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天可能是太多的线,但我认为有一种“每日季节性”我想调查,这似乎是一个有用的可视化之前更严格.

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

我的想法

我对熊猫还不是很熟悉,但我设法将我的数据分组到日常垃圾箱中

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

怎么做几个星期

>创建一个多索引

>包括代表一周的期间
>包括星期几
>包括一天中的时间

>取消堆栈以将每周时段放入列中
>仍然不相信轴格式

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

转载注明原文:如何在Pandas的“白昼时期”覆盖数据以进行绘图 - 代码日志