【问题标题】:Pandorific dayofyear Comparison with Leap YearsPandorific dayofyear 与闰年的比较
【发布时间】:2017-06-29 21:35:22
【问题描述】:

我是 Pandas 的新手,并试图对包括闰年在内的一些年份进行逐年比较。他们的“dayofyear”功能很棒……除非有闰年。 这是我的代码:

df = pd.read_csv('myfile.csv')
df['Date']  = pd.to_datetime(df['Date'])
df['Day_of_Year'] = df['Date'].dt.dayofyear
## Deal with 2008 leap year
df_2008_1st = df[(df['Date'] >= '01/01/2008')
            & (df['Date'] <= '02/28/2008')]
df_2008_2nd = df[(df['Date'] >= '03/01/2008')
            & (df['Date'] <= '12/31/2008')]
df_2008_2nd['Day_of_Year'] = df_2008_2nd['Day_of_Year'] -1
df_2008 = df_2008_1st.append(df_2008_2nd)

我的问题分为两个部分,一个可能是主观的。
首先,必须有一种更好、更短、更快的方式来编写这段代码。 这是可行的,但我确信它更容易完成一些编码。

其次,我将用这个制作年度销售数字的每日比较图表。我不知道标准做法是什么——阅读闰年的代码建议,我可以找到一个关于如何在实践中处理这个问题的硬性和快速指南。有人愿意分享他们在实践中如何处理闰日数据吗?

谢谢你, 我

【问题讨论】:

    标签: python python-3.x pandas leap-year


    【解决方案1】:

    您可以像这样为每一天组成一个任意索引:

    df['Day_of_Year'] = df['Date'].dt.month*31 + df['Date'].dt.day

    这样,具有相同“Day_of_Year”值的条目将对应相同的日期,而与闰年无关。

    【讨论】:

      【解决方案2】:

      我认为这通过不创建和合并新的 DataFrames 稍微简化了您的代码。

      df = pd.read_csv('myfile.csv')
      df['Date']  = pd.to_datetime(df['Date'])
      df = df[(df['Date'] != '02/29/2008')] # this removes Feb, 29
      df['Day_of_Year'] = df['Date'].dt.dayofyear
      
      mask = (df['Date'] >= '03/01/2008') & (df['Date'] <= '12/31/2008')
      df.loc[mask, 'Day_of_Year'] = df.loc[mask, 'Day_of_Year'] - 1
      
      df.iloc[56:63]
      
          Date        Day_of_Year
      56  2008-02-26  57
      57  2008-02-27  58
      58  2008-02-28  59
      60  2008-03-01  60
      61  2008-03-02  61
      62  2008-03-03  62
      63  2008-03-04  63
      

      根据您的情况是否允许,我会使用日期作为索引,这使得切片和其他基于日期的分析更加容易。 (注意:读取csv时可以进行索引和日期解析。)

      df1 = pd.read_csv('myfile.csv', index_col='Date', 
                        parse_dates=True, infer_datetime_format=True)
      df1 = df1[(df1.index != '02/29/2008')] # this removes Feb, 29
      df1['Day_of_Year'] = df1.index.dayofyear
      df1.loc['03/01/2008':'12/31/2008', 'Day_of_Year'] = df1.loc['03/01/2008':'12/31/2008', 'Day_of_Year'] - 1
      

      然后您可以使用这样的切片进行抽查:

      df1.loc['02/26/2008':'3/3/2008']
      

      返回:

                  Day_of_Year
      Date    
      2008-02-26  57
      2008-02-27  58
      2008-02-28  59
      2008-03-01  60
      2008-03-02  61
      2008-03-03  62
      

      至于如何处理闰日,这可能更多的是商业决策,所以这里可能无法回答。但这个问题可能会有所帮助:Accounting for leap year in comparing year to year sales

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-22
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多