【问题标题】:Plot frequency of dates in interval occurred in pandas dataframe在熊猫数据框中出现间隔日期的绘图频率
【发布时间】:2018-04-07 20:00:29
【问题描述】:

我有日期从 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")

我想在特定日期之间获取此图,我尝试输入df['last_payout'].dt.year &gt; 2016,但我得到了这个:

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

【问题讨论】:

    标签: python pandas


    【解决方案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")
    )
    

    编辑:对于有年份的月份,通过 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")
    )
    

    【讨论】:

    • Ami Tavory 的回答中的related_df 是哪里?
    • @user40 - 哎呀,错了。我希望它现在运行良好。
    • 感谢您提供如此详细的回答,能否请您说明如何扩展绘图以使其在 X 轴上有几个月?谢谢
    • @user40 - 你认为年份和月份吗?喜欢2016-01?还是只有months 而没有years?
    • 是的,有年有月,就像时间线一样。
    【解决方案2】:

    注意

    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")
    

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 2020-01-14
      • 2020-01-13
      • 2012-09-06
      • 2021-05-10
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多