我有一个像这样的数据集:
>>> print(ds.head())
date sum
0 2013-08-31 19.000
1 2013-09-01 37.000
2 2013-09-02 10.750
3 2013-09-03 21.500
4 2013-09-04 44.125
>>> print(ds.tail())
date sum
1742 2018-08-24 129.875
1743 2018-08-25 196.375
1744 2018-08-26 247.000
1745 2018-08-27 104.125
1746 2018-08-28 149.250
数据集包含约1700行,其中包含每日数据。 我想绘制一个箱线图,所以请查看每月值。 像这样
我需要使用JAN / FEB / MAR等x轴上的月份。
如果有每日数据集,我找不到任何可行的解决方案可以实现这一目标。我认为我必须先进行数据准备并每月对值进行分组? 还是我可以用一种简单而又简短的方式对此进行编程?
答案 0 :(得分:1)
假设您的DataFrame df
包含两列“ date”和“ sum”,我们需要在“ date”字段上对它进行排序,以使行以正确的顺序排列,否则我们可以看到月份顺序错误。然后,我们需要创建一个支持列,其中包含每个日期的月份名称。就是这样,我们已经准备好进行剧情准备。
代码在这里:
import pandas as pd
import seaborn as sns
# just an example...
df = pd.DataFrame([["2013-08-31", 19], ["2013-09-01", 37], ["2013-09-02", 10.75]], columns=["date", "sum"])
# sort the rows by date
df.sort_values(by="date", inplace=True)
# create a support series with the name of the month of each row
month_names = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
months = df["date"].apply(lambda date: month_names[int(date.split("-")[1])-1])
# plot it
sns.boxplot(months, df["sum"])
希望对您有帮助。
答案 1 :(得分:1)
您可以从日期时间开始使用功能strftime。
这里是一个例子:
from datetime import date
import random
import pandas as pd
from seaborn import boxplot
dates = [date.today()]*10
dataSum = [random.randint(1,100) for x in range(10)]
d = {'date': dates, 'sum':dataSum}
df = pd.DataFrame(data = d)
dateData = [x.strftime('%B') for x in df['date']]
boxplot(dateData, df['sum'])
答案 2 :(得分:1)
您可以使用dt.strftime('%b')
元素并按如下所示创建月份列:
df=pd.DataFrame(np.random.randint(50,1000,365).reshape(-1,1),
index=pd.date_range('2018-01-01','2018-12-31',freq='D'),
columns=['sum'])
df.reset_index(inplace=True)
df.columns = ['Date','sum']
df.head()
Date sum
0 2018-01-01 984
1 2018-01-02 582
2 2018-01-03 967
3 2018-01-04 503
4 2018-01-05 330
df['month'] = df['Date'].dt.strftime('%b')
使用seaborn.boxplot
并传递x='month'
,y='sum'
和data=df
作为参数。您将获得所需的箱线图。
fig, ax = plt.subplots()
fig.set_size_inches((12,4))
sns.boxplot(x='month',y='sum',data=df,ax=ax)
plt.show()