2016-09-28 9 views
1

dfにはncolumnsが含まれています。これらのうちの1つはという名前のdateで、値はmm-dd-yyとなっています。今度はdfcolumnintervalを追加します。このcolumnは、dateに含まれるyearを返しますが、H1またはH2の場合にも返されます。 H1は半年であり、01-dd-yy06-dd-yyの間の値はすべてdateであり、したがってH2は、07-dd-yy12-dd-yyの間の値である必要があります。日付の列範囲に基づいてデータフレームに列を追加する

これはdf['date']のデータの例です。だから私は、私はfunctionを作成しようと思いました

0   16H1 
    1   16H1 
    2   16H1 
    3   16H1 
    4   16H1 
    5   16H1 
    6   16H2 
    7   16H2 
    8   16H2 
    9   15H2 
    ...etc... 

と:私は含むintervalをという名前の別の列を追加したい

df
0   01-27-16 
1   02-27-16 
2   03-27-16 
3   04-27-16 
4   05-27-16 
5   06-27-16 
6   07-27-16 
7   08-24-16 
8   09-24-16 
9   10-16-15 
...etc... 

mapを使用します。

def is_in_range(x): 
    if x['date'] >= '01-01-16' x['date'] <= '06-31-16': 
     print '16H1' 
    elif x['date'] >= '07-01-16' and x['date'] <= '12-31-16': 
     print '16H2' 
    elif x['date'] >= '01-01-15' and x['date'] <= '06-31-15': 
     print '15H1' 
    elif x['date'] >= '07-01-15' and x['date'] <= '12-31-15': 
     print '15H2' 
    ...etc... 

私はこのような関数を呼び出す:

df.groupby(df['date'].map(is_in_range)) 

は今、これは私に与える:そもそも

`TypeError: 'Timestamp' object has no attribute 'getitem'

を。なぜ私は確信していませんが、いずれにしても確実に良い方法でなければなりませんか?

答えて

1

dt.quarterまたはdt.monthを使用できます。

年の値をstrastypeに変換し、最後に2文字を選択してください。条件付き最終使用numpy.where

#first convert to datetime if not datetime 
df.date = pd.to_datetime(df.date) 

df['interval'] = df.date.astype(str).str[2:4] + np.where(df.date.dt.month < 7, 'H1','H2') 
print (df) 
     date interval 
0 2016-01-27  16H1 
1 2016-02-27  16H1 
2 2016-03-27  16H1 
3 2016-04-27  16H1 
4 2016-05-27  16H1 
5 2016-06-27  16H1 
6 2016-07-27  16H2 
7 2016-08-24  16H2 
8 2016-09-24  16H2 
9 2015-10-16  15H2 

または:

df['interval'] = df.date.astype(str).str[2:4] + np.where(df.date.dt.quarter < 3,'H1','H2') 
print (df) 
     date interval 
0 2016-01-27  16H1 
1 2016-02-27  16H1 
2 2016-03-27  16H1 
3 2016-04-27  16H1 
4 2016-05-27  16H1 
5 2016-06-27  16H1 
6 2016-07-27  16H2 
7 2016-08-24  16H2 
8 2016-09-24  16H2 
9 2015-10-16  15H2 

stringソリューション:

df['interval'] = df.date.str[6:] + np.where(df.date.str[:2].astype(int) < 7, 'H1','H2') 
print (df) 
     date interval 
0 01-27-16  16H1 
1 02-27-16  16H1 
2 03-27-16  16H1 
3 04-27-16  16H1 
4 05-27-16  16H1 
5 06-27-16  16H1 
6 07-27-16  16H2 
7 08-24-16  16H2 
8 09-24-16  16H2 
9 10-16-15  15H2 

リスト内包表記のソリューションが動作しない場合はNaNを

stringコルUMN:

df['interval'] = [x[6:] + 'H1' if int(x[:2])< 7 else x[6:] + 'H2' for x in df['date']] 

datetimeコラム:

#first convert to datetime if not datetime 
df.date = pd.to_datetime(df.date) 

df['interval'] = [x[2:4] + 'H1' if int(x[5:7])< 7 else x[2:4] + 'H2' for x in df['date'].astype(str)] 

print (df) 
     date interval 
0 01-27-16  16H1 
1 02-27-16  16H1 
2 03-27-16  16H1 
3 04-27-16  16H1 
4 05-27-16  16H1 
5 06-27-16  16H1 
6 07-27-16  16H2 
7 08-24-16  16H2 
8 09-24-16  16H2 
9 10-16-15  15H2 
1

は、文字列 '日付' 欄のですか?あなたは本当にに文字列の最後の2つの要素を変換すること

のような文字列を比較することはできませんint型

A = [x[6:]+'H1' if int(x[6:]+)< 7 else 'H2' for x in df['date'].values] 

し、最終的に

df['interval'] = A 
関連する問題