2017-05-18 5 views
0

私はパンダの初心者であり、うるう年を含む何年もの年を比較しようとしています。彼らは '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) 

私の質問は2つの一部であり、一つは主観的かもしれません。
まず、このコードを書くためには、より良い、短く、速い方法が必要です。 これは動作していますが、それは私が行うことがより簡単なもののためのコーディングのトンです。

第二に、私はこれと売上高の日別比較チャートを作成します。私は標準的な練習が何かを知りません - うるう年のコード提案を読むことは、これを実際にどのように扱うべきかについての難しい速いガイドを見つけることができます。実際に閏年のデータをどのように処理するかについて誰でも気にしていますか?

は、 ミー

答えて

1

をありがとう、私はこれが新しいデータフレームを作成し、マージしないことで、少しコードを簡素化すると思います。

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 

うるう年を処理する方法については、おそらくビジネス上の決定のほうが多いので、おそらくここでは回答できません。しかし、この質問は役に立つことがあります。このように

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

、同じ「DAY_OF_YEAR」の値を持つエントリはに対応します:Accounting for leap year in comparing year to year sales

1

次のような毎日のために任意のインデックスを構成することができうるう年に関係なく同じ日付。

関連する問題