间隔中日期的绘图频率发生在pandas数据帧中

时间:2018-04-07 11:22:17

标签: python pandas

我的数据框有1970年到2018年的日期,我想绘制从2016年到2017年的发生频率。

In[95]: df['last_payout'].dtypes
Out[95]: dtype('<M8[ns]')

数据以这种格式存储:

In[96]: df['last_payout'].head
​​
Out[96]: <bound method NDFrame.head of 0         1970-01-01
1         1970-01-01
2         1970-01-01
3         1970-01-01
4         1970-01-01

我使用group bycount

逐年绘制此图
 In[97]: df['last_payout'].groupby(df['last_payout'].dt.year).count().plot(kind="bar")

enter image description here

我想在特定日期之间得到这个情节,我试图放df['last_payout'].dt.year > 2016,但我得到了这个:

enter image description here

如何获取特定日期范围的情节?

2 个答案:

答案 0 :(得分:1)

请注意

df['last_payout'].dt.year > 2016

只返回一个布尔系列,所以绘制这个系列确实会显示一个条形图,其中包含了这个或不是的日期数。

首先尝试创建相关的df:

relevant_df = df[(df['last_payout'].dt.year > 2016) & (df['last_payout'].dt.year <= 2017)]

(当然,取决于你想要什么,使用严格或不平等。)

然后对其进行绘图:

relevant_df['last_payout'].groupby(relevant_df['last_payout'].dt.year).count().plot(kind="bar")

答案 1 :(得分:1)

我认为首先需要按betweenboolean indexing进行过滤:

rng = pd.date_range('2015-04-03', periods=10, freq='7M')
df = pd.DataFrame({'last_payout': rng})  
print (df)
  last_payout
0  2015-04-30
1  2015-11-30
2  2016-06-30
3  2017-01-31
4  2017-08-31
5  2018-03-31
6  2018-10-31
7  2019-05-31
8  2019-12-31
9  2020-07-31

(df.loc[df['last_payout'].dt.year.between(2016, 2017), 'last_payout']
       .groupby(df['last_payout'].dt.year)
       .count()
       .plot(kind="bar")
)

替代解决方案:

(df.loc[df['last_payout'].dt.year.between(2016, 2017), 'last_payout']
         .dt.year
         .value_counts()
         .sort_index()
         .plot(kind="bar")
)

graph

编辑:有几年的月份将日期时间转换为月份期间to_period

(df.loc[df['last_payout'].dt.year.between(2016, 2017), 'last_payout']
         .dt.to_period('M')
         .value_counts()
         .sort_index()
         .plot(kind="bar")
)