2017-06-13 5 views
3

私は4年間のデータを含むcsvファイルを持っており、4年間にわたってシーズンごとのデータをグループ化しようとしています。シーズンのみ。 ここに私のデータファイルの表情だ。ここ正確な日付に基づいてシーズン別にデータをグループ化する

timestamp,heure,lat,lon,impact,type 
2006-01-01 00:00:00,13:58:43,33.837,-9.205,10.3,1 
2006-01-02 00:00:00,00:07:28,34.5293,-10.2384,17.7,1 
2007-02-01 00:00:00,23:01:03,35.0617,-1.435,-17.1,2 
2007-02-02 00:00:00,01:14:29,36.5685,0.9043,36.8,1 
2008-01-01 00:00:00,05:03:51,34.1919,-12.5061,-48.9,1 
2008-01-02 00:00:00,05:03:51,34.1919,-12.5061,-48.9,1 
.... 
2011-12-31 00:00:00,05:03:51,34.1919,-12.5061,-48.9,1 

とです私の所望の出力:

names =["timestamp","heure","lat","lon","impact","type"] 
data = pd.read_csv('flash.txt',names=names, parse_dates=['timestamp'],index_col=['timestamp'], dayfirst=True) 

spring = range(80, 172) 
summer = range(172, 264) 
fall = range(264, 355) 

def season(x): 
    if x in spring: 
     return 'Spring' 
    if x in summer: 
     return 'Summer' 
    if x in fall: 
     return 'Fall' 
    else : 
     return 'Winter' 

data['SEASON'] = data.index.to_series().dt.month.map(lambda x : season(x)) 
data['impact'] = data['impact'].abs() 
seasonly = data.groupby('SEASON')['impact'].mean() 

と私はこの恐ろしい結果を得た:実際に私はこのコードを試してみた

winter  (the mean value of impacts) 
summer  (the mean value of impacts) 
autumn  .... 
spring  ..... 

enter image description here

私は間違っていますか?

答えて

2

あなたがDatetimeIndex.dayofyear必要があります。

data['SEASON'] = data.index.dayofyear.map(season) 

pandas.cutのもう一つの解決策:

bins = [0, 91, 183, 275, 366] 
labels=['Winter', 'Spring', 'Summer', 'Fall'] 
doy = data.index.dayofyear 
data['SEASON1'] = pd.cut(doy + 11 - 366*(doy > 355), bins=bins, labels=labels) 
+0

ええ、それは働いています、@ jezrael –

+0

@ piRSquaredありがとう、ありがとう、私はそれに取り組んでいます。 – jezrael

2

は、次のようになります。

data['SEASON'] = data.index.to_series().dt.**month**.map(lambda x : season(x)) 

はすべて "冬" であると思われる1-12または0-11ヶ月使用しています。 年末年始を使用する必要があります。

しかし、これをもっと簡単に見て、1日のうちに抽出したものを1つのライナー内に閉じ込めなかった場合は、自分で確認することができました。ただ言って。

+0

はい、あなたは絶対的に正しいです、あなたが言ったように、私は今年の一日を書くことができますどのように、私はちょうどチェックして印刷すると、彼らはすべての冬ですか? –

+0

それは今働いています、ありがとうございます。 –

3

pandas.cut
適切'Winter'今年の初めと終わりの両方であることを処理するためには、私はdayofyear11で移動し、結果のmodを取ったulo 366。以下のnumpyソリューションと同じテクニックを使用しない理由は、pd.cutがカテゴリ型を返し、2つのカテゴリが同じラベルを持つ5つのカテゴリになります。結果を文字列としてキャストすることはできましたが、それはうっすらと感じました。適切であること'Winter'を扱うために

data['SEASON'] = pd.cut(
    (data.index.dayofyear + 11) % 366, 
    [0, 91, 183, 275, 366], 
    labels=['Winter', 'Spring', 'Summer', 'Fall'] 
) 

numpy.searchsorted
両方の年の初めと終わりに、私は'Winter'

seasons = np.array(['Winter', 'Spring', 'Summer', 'Fall', 'Winter']) 
f = np.searchsorted([80, 172, 264, 355], data.index.dayofyear) 
data['SEASON'] = seasons[f] 

のための2つのビンを許可

plot

data.groupby('SEASON')['impact'].mean().plot.bar() 

enter image description here

+0

あなたが言ったように、私はこのエラーを受けました: 'numpy.ndarray'オブジェクトに属性 '値'がありません –

+0

@MarieAntoinette 'pandas'の古いバージョンでは忘れています... 。 やってみよう。 – piRSquared

+0

あなたはまだ覚えています、それは今働いている編集のためにあまりにもありがとう –

関連する問題