在 pandas 中,是不是有一些紧凑的方法可以在一周中的几天内绘制数据?
Posted
技术标签:
【中文标题】在 pandas 中,是不是有一些紧凑的方法可以在一周中的几天内绘制数据?【英文标题】:In pandas, is there some compact way to plot data across days of the week?在 pandas 中,是否有一些紧凑的方法可以在一周中的几天内绘制数据? 【发布时间】:2017-12-23 22:38:50 【问题描述】:我有一个简单的数据框,其中包含一组针对设置为索引的datetime
s 记录的值。是否有一些紧凑的方法可以在一周的几天内绘制这些数据?我的意思是这样的,横轴是一周中的几天,不同周的数据以各种颜色绘制:
我当前的代码如下,但对于一个概念上简单的东西来说似乎很复杂:
df["weekday"] = df["datetime"].dt.weekday
df["weekday_name"] = df["datetime"].dt.weekday_name
df["time_through_day"] = df["datetime"].map(lambda x: x - datetime.datetime.combine(x.date(), datetime.time()))
def days_through_week(row):
return row["weekday"] + row["time_through_day"] / (24 * np.timedelta64(1, "h"))
df["days_through_week"] = df.apply(lambda row: days_through_week(row), axis = 1)
datasets = []
dataset = []
previous_days_through_week = 0
for days_through_week, value in zip(df["days_through_week"], df["value"]):
if abs(days_through_week - previous_days_through_week) < 5:
dataset.append([days_through_week, value])
else:
datasets.append(dataset)
dataset = []
previous_days_through_week = days_through_week
for dataset in datasets:
x = [datum[0] for datum in dataset]
y = [datum[1] for datum in dataset]
plt.plot(x, y, linestyle = "-", linewidth = 1.3)
plt.ylabel("value")
plt.xticks(
[ 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5],
[ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
)
【问题讨论】:
你能分享一下 df.head() 的输出吗?你也可以使用像 seaborn 这样的其他库吗? pandas day of week axis labels的可能重复 据我了解,数据框涵盖了数周的数据,其中每周的数据应以不同的颜色着色(绘制为单独的曲线)。因此它不是linked question 的副本。但我同意在问题中提供一些示例数据(使用 pd.date_range 左右)将是有益的。 【参考方案1】:设置:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
np.random.seed(51723)
#Make some fake data to play with. Includes a partial week.
n = pd.DatetimeIndex(start="2-Jan-2017", end="1-Mar-2017", freq="1H")
df = pd.DataFrame(index=n, data=np.random.randn(n.size), columns=['A'])
df.A = df.groupby(df.index.week).A.transform('cumsum')
剧情:
#list of names for xtick labels. Extra Monday for end.
weekday_names = "Mon Tue Wed Thu Fri Sat Sun Mon".split(' ')
fig, ax = plt.subplots()
for name, group in df.groupby(df.index.week):
start_day= group.index.min().to_pydatetime()
#convert date to week age
Xs = mdates.date2num(group.index.to_pydatetime()) \
- mdates.date2num(start_day)
Ys = group.A
ax.plot(Xs, Ys)
ax.set_xticklabels(weekday_names)
ax.set_xticks(range(0, len(weekday_names)))
【讨论】:
我想做类似的东西,但不知道怎么做。假设一年中的每一天我都有一个值并且想要生成一个带有 52 个图表的图。每个图表代表不同的一周。在 X 轴上,我想要工作日。我试图更改您的代码,即将“1H”更改为“1D”,但我得到“Grouper 和轴必须相同长度”。我应该改变什么?以上是关于在 pandas 中,是不是有一些紧凑的方法可以在一周中的几天内绘制数据?的主要内容,如果未能解决你的问题,请参考以下文章
在 C++/STL 中是不是有与 Python range() 等效的紧凑函数
在 python 中使用 pandas,numpy 是不是有 pyspark.ml.feature StringIndexer 的替代方法?
在 Pandas 中是不是有一种 pythonic 的方法来做一个列联表?
当您的数据不在偶数时间间隔内时,是不是有一种快速方法可以在偶数时间间隔内对 Pandas Dataframe 进行滚动求和?