Pandorific dayofyear 与闰年的比较

Pandorific dayofyear Comparison with Leap Years

我是 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)

我的问题分为两个部分,其中一个可能是主观的。
首先,必须有更好、更短、更快的方法来编写这段代码。 这是可行的,但对于我确信更容易做到的事情来说,它需要大量编码。

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

谢谢, 我

我认为这通过不创建和合并新的数据帧来稍微简化您的代码。

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']

哪个returns:

            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

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

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

这样,具有相同'Day_of_Year'值的条目将对应相同的日期,而不管闰年。