Python 大熊猫的时间序列箱线图

Python 大熊猫的时间序列箱线图,python,pandas,time-series,boxplot,Python,Pandas,Time Series,Boxplot,如何为每天都有一个方框的熊猫时间序列创建箱线图 每小时数据的样本数据集,其中一个框应由24个值组成: import pandas as pd n = 480 ts = pd.Series(randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H"))

如何为每天都有一个方框的熊猫时间序列创建箱线图

每小时数据的样本数据集,其中一个框应由24个值组成:

import pandas as pd
n = 480
ts = pd.Series(randn(n),
               index=pd.date_range(start="2014-02-01",
                                   periods=n,
                                   freq="H"))
ts.plot()
我知道我可以为当天制作一个额外的专栏,但我希望有适当的x轴标签和x限制功能(如
ts.plot()
),因此能够使用datetime索引将非常棒


如果R/ggplot2有助于澄清我想要的内容,则会有一个类似的问题。

如果这是您的一个选项,我建议使用,它是Matplotlib的包装器。您可以通过在timeseries中的组之间循环来完成这项工作,但这需要做更多的工作

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

n = 480
ts = pd.Series(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H"))


fig, ax = plt.subplots(figsize=(12,5))
seaborn.boxplot(ts.index.dayofyear, ts, ax=ax)
其中:

请注意,我将把
年中的日期作为
石斑鱼
传递给seaborn,如果您的数据跨越多年,这将不起作用。然后你可以考虑一些类似的事情:

ts.index.to_series().apply(lambda x: x.strftime('%Y%m%d'))
编辑,每3小时一次,您可以将其用作grouper,但它仅在没有分钟或更低定义的情况下有效:

[(dt - datetime.timedelta(hours=int(dt.hour % 3))).strftime('%Y%m%d%H') for dt in ts.index]
(没有足够的代表对接受的解决方案发表评论,因此请添加答案。)

接受的代码有两个小错误:(1)需要添加
numpy
import;(2)需要交换
box-plot
语句中的
x
y
参数。下面生成所示的绘图

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

n = 480
ts = pd.Series(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H"))

fig, ax = plt.subplots(figsize=(12,5))
seaborn.boxplot(ts.index.dayofyear, ts, ax=ax)

我有一个可能有用的解决方案——它只使用本地pandas,并允许分层日期时间分组(即跨越年份)。关键是,如果您将函数传递给
groupby()
,它将在数据帧索引的每个元素上被调用。如果您的索引是
DatetimeIndex
(或类似),则可以访问dt的所有方便功能进行重新采样

试试这个:

n = 480
ts = pd.DataFrame(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H"))
ts.groupby(lambda x: x.strftime("%Y-%m-%d")).boxplot(subplots=False, figsize=(12,9), rot=90)

实际上我确实使用seaborn,所以这绝对是一个选择。谢谢/编辑:是否有任何方法可用于任意时间,例如3小时箱线图、7天箱线图等?是的,您可以向Seaborns grouper发送任何信息。挑战在于从系列的索引中定义组。我添加了一个3小时周期的示例。类似的东西可以在任意时间段内工作。不幸的是,它的可读性不是很强,也许可以通过使用Pandas
Timegrouper
进行一些简化。打开一个关于Seaborns grouper的特定问题,可能会从那些经常使用Seaborn的人那里得到一些帮助,而我不是。对于这个问题,可能有一个更好的解决方案,它只使用熊猫,它的
.boxplot()
.pivot()
函数,不需要Seaborn。你是最好的!