我有一个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]:
现在我一直在努力确定我应该如何创建一个新的DataFrame结构,以便可以在白天覆盖这些图.这是我无法弄清楚的基本问题 - 如何利用DataFrameGroupBy对象覆盖图?一个非常基本的看似方法是迭代每个GroupBy对象,但我这样做的问题是配置x轴使得它只显示独立于特定日期的"每日时间段",而不是捕获整个时间戳.
将数据拆分成单独的帧并在同一图中调用它们并使用某种日期强制来在这个更一般的答案中使用该方法对我来说似乎并不是很好.
您可以使用类似的方式生成伪数据:
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))
piRSquared.. 6
考虑数据帧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()
但这不是很有帮助.
你可能会尝试这样的东西......希望这会有所帮助
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()
怎么做几个星期
创建一个多索引
包括代表一周的时期
包括星期几
包括一天中的时间
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()
考虑数据帧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()
但这不是很有帮助.
你可能会尝试这样的东西......希望这会有所帮助
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()
怎么做几个星期
创建一个多索引
包括代表一周的时期
包括星期几
包括一天中的时间
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()