我有 8 年的日常数据。我想绘制一周中的每一天、一年中的每周和一年中的每个月的所有值。我怎么做?

Posted

技术标签:

【中文标题】我有 8 年的日常数据。我想绘制一周中的每一天、一年中的每周和一年中的每个月的所有值。我怎么做?【英文标题】:I have 8 years of daily data. I want to graph all values per day of the week, per weeks in a year and per month in a year. How do I do that? 【发布时间】:2019-05-31 09:22:46 【问题描述】:

我希望能够在一周中的每一天、一年中的每一周和每个月可视化我的数据点。我能够每年可视化我的数据。但是当我调整每月和每周的代码时,x 轴保持每年不变。

我有 8 年的住院记录。我的数据分为 2 列。第 1 列是我的“日期”列,从 2010 年 3 月 10 日开始,到 2017 年 12 月 31 日结束。第 2 列是我的价值列。此栏列出了我是否有患者来接受治疗。第 2 列中的值是 0 或 x 个数字。例如,0 表示我没有患者 x 表示我有 x 名患者。当我尝试以图形方式表示这些数据时,它只计算我每周拥有的最大 x 数。

df=pd.read_csv('Data 3.csv', parse_dates=["Dates"], index_col="Dates")
# create the plot space upon which to plot the data
fig, ax = plt.subplots(figsize = (10,10))

# add the x-axis and the y-axis to the plot
ax.plot(df.resample('Y').sum()['Total # Events'],color = 'blue')

# rotate tick labels
plt.setp(ax.get_xticklabels(), rotation=45)

# set title and labels for axes
ax.set(xlabel="Years",
ylabel="Total # of Events",
title="Yearly Treatment Events from 2010-2017");

Graph result

所以我得到了正确的图形。但是,当我每月将 (df.resample('Y').sum() 从 ('Y') 更改为 ('M') 时,我会得到一个显示每年 X 轴和值的图表。我该如何更改获取每月 X 轴和每周 X 轴?

【问题讨论】:

你能提供样本数据来进行一些分析吗?据我所知,如果您有日期,则可以使用日期时间索引,并通过使用值所属的周、月或年将数据分组为每周、每月和每年,然后对它们求和,然后执行绘图。它不应该那么困难。如果你提供我 2 年的小样本,我可以告诉你如何去做。也许使用 Google Drive 来共享示例数据。 听起来不错。这是数据集的谷歌驱动器。谢谢您的帮助! drive.google.com/file/d/16m_0tl3_MEzAQ7g5E02uZXQAkRiBt3WA/… 给我 5 分钟,继续努力。 所以我已经尝试了所有方法,我认为唯一的解决方案是每周和每月使用不同的数据表示形式。您可以取消堆叠您的值并分别显示一年中每个月的多行。 Qlik 和其他可视化软件在其下方显示月份和年份,有点像这样:community.qlik.com/legacyfs/online/… 但不确定这在 Python 中是否可行。你在上图中看到的,你想要那种东西吗? 是的,我想要这样的东西。我在使用 MATLAB 之前已经这样做了,我记得这非常乏味,因为我必须循环所有内容才能得到我想要的。我试图避免在 Python 中做同样的事情。我在 GitHub 上发布了我的代码供您查看。顺便说一句,非常感谢您到目前为止的所有帮助! github.com/3twezzy/… 【参考方案1】:

按照 matplotlib.org 上名为 "Date tick labels" 的指南,我建议使用这些参数:

# format the ticks
ax.xaxis.set_major_locator(years)
ax.xaxis.set_major_formatter(yearsFmt)
ax.xaxis.set_minor_locator(months)

例如,尝试在ax.plot() 之后仅将此行添加到您的代码中:

ax.xaxis.set_major_locator(months)

请记住,尽管您对数据进行了重新采样,但并不会更改开始日期或结束日期。您的图表看起来非常相似,只是它现在更平滑了;它不会有 7 分,而是 7 * 12 分。

【讨论】:

【参考方案2】:

所以,正如我所假设的,考虑到日期是可用的,这很容易。

所以首先创建新的列来表示日期所属的周、年和月。为此,您需要在读取 csv 时将 Dates 设置为 index 和 parse_dates:

data=pd.read_csv('Data 3.csv',index_col='Dates',parse_dates=True)

现在您可以创建三列:

data['Week']=data.index.week
data['Month']=data.index.month
data['Year']=data.index.year

这将为您提供如下数据:

            Total # Events  Week  Year  Month
Dates                                        
2010-03-10               0    10  2010      3
2010-03-11               4    10  2010      3
2010-03-12               0    10  2010      3
2010-03-13               0    10  2010      3
2010-03-14               0    10  2010      3
2010-03-15               0    11  2010      3
2010-03-16               0    11  2010      3
2010-03-17               0    11  2010      3
2010-03-18               2    11  2010      3
2010-03-19               0    11  2010      3

我不会为你分享整个代码,我只会展示 Year 输出以及它是如何工作的,休息一下,我希望你能自己做,否则你不会学到任何东西。

那么下一步就是:

Yearwise=data.groupby(by=('Year')).sum()['Total # Events']

就是这样,绘制它:

plt.figure(figsize=(14,10))
Yearwise.plot()

您也分享的图表是:

请记住,对于月份而言,您需要将年份和月份放在一起进行分组,否则最终会将所有相同编号的月份分组在一起。我的意思是这样的——

by=('Year','Month'))

休息一下,我相信您可以自己解决。如果您遇到错误,请告诉我。

【讨论】:

哦,非常感谢您的帮助。我会让你知道这是怎么回事! 哦,你只想要这个?哈哈,我在一个小时前做了这个,但后来以为你只是在情节上有问题,就把它删除了。如果您无法为他们生成代码,请告诉我。 它工作得很好。现在我只是想知道如何将 x 轴标记为月份和工作日的 str 名称。感谢所有的帮助,谢谢!! 不客气,祝你命名部分好运,这有点棘手,相信我。顺便说一句... Qliksense 是免费使用的,您可以下载它并使用您的数据,就像我在上面的 cmets 中向您展示的图表一样。但是,玩得开心,新年快乐。 :D 肯定会检查 Qliksense。也祝你新年快乐。 :D

以上是关于我有 8 年的日常数据。我想绘制一周中的每一天、一年中的每周和一年中的每个月的所有值。我怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

遍历数据框并绘制每一列

MySQL - 计算一周中每一天但每个发件人的所有行

SQL查询,用于在一周中的每一天为项目排序的EACH类别中查找UNITS

如何更改 Graphite/Grafana 中的 x 轴(按天绘制)?

订购一周中的一天[重复]

为每一天设置不同的颜色(小部件)