我的数据框有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 by
和count
In[97]: df['last_payout'].groupby(df['last_payout'].dt.year).count().plot(kind="bar")
我想在特定日期之间得到这个情节,我试图放df['last_payout'].dt.year > 2016
,但我得到了这个:
如何获取特定日期范围的情节?
答案 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)
我认为首先需要按between
和boolean 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")
)
编辑:有几年的月份将日期时间转换为月份期间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")
)