【问题标题】:Plotting date in Pandas independent of year在熊猫中绘制日期与年份无关
【发布时间】:2013-12-20 22:18:44
【问题描述】:

我有一个包含订单的数据框,以及每个订单发生的日期,每天允许多个订单。我已经设法在数据框 df 中按天绘制订单数量:

df.groupby('order_date')['order_id'].count().plot()

这运行了好几年,我感兴趣的是将每年绘制在彼此之上,因此 x 轴仅包含一个月和一天。我目前的尝试是这样的:

grouped=df.groupby([df['order_date'].map(lambda x: x.year)])
groups=[]
for name,group in grouped:
    groups.append(group)
for group in groups:
    group.groupby([group['order_date'].map(lambda x: pd.to_datetime(str(x.month)+"-"+str(x.day), format="%m-%d"))])['order_id'].count().plot() 

我按年份对我的所有数据进行分组,然后对于每一年,我按从 order_date 中的实际日期时间确定的月日日期时间对它进行分组。但是,这给了我以下错误:

 ValueError: Out of bounds nanosecond timestamp: 1-09-01 00:00:00

我认为这是我的价值观之一,但我不确定这里到底出了什么问题。有没有更简单的方法来做我想做的事,还是我在代码中犯了错误?

【问题讨论】:

  • 我们能否获取您的数据的最小和可复制/可粘贴部分来生成引发错误的数据框?
  • 我希望我能,但我不能。

标签: python matplotlib pandas


【解决方案1】:

我认为,如果您想逐年绘制,xaxis 必须具有相同的日期范围。为了支持闰年,您可以将所有日期转移到 2000 年,这是我的尝试:

import numpy as np
import pandas as pd

### create sample data
date = pd.date_range("2010-01-01", periods=365*3)
date = pd.Index(np.random.choice(date, 30000))
order_id = np.random.randint(10, 1000, size=30000)

df = pd.DataFrame({"date":date, "order_id":order_id})

### group by year and date
date = pd.Index(df["date"])
df2 = df["order_id"].groupby([date.year, date]).count()

### shift all year to 2000
date = df2.index.get_level_values(1)
new_date = pd.Index(pd.io.date_converters.parse_date_fields(np.ones(len(date))*2000, date.month, date.day))
year = df2.index.get_level_values(0)
df2.index = pd.MultiIndex.from_arrays([year, new_date])

### plot
p = df2.unstack(0).plot()
p.xaxis.set_ticklabels(range(1, 13));

输出:

【讨论】:

  • 我现在正在实施这个解决方案。我和你使用一年的想法一样,但我认为这种类型的情节可能会有一些自然的实现。
猜你喜欢
  • 2014-10-14
  • 2018-07-25
  • 2018-05-16
  • 2020-12-21
  • 2020-01-14
  • 2019-08-21
  • 2015-05-27
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多