2016-09-28 5 views
1

У меня есть df, содержащий ncolumns. Один из них - column с именем date, который содержит значения, отформатированные как mm-dd-yy. Теперь я хочу добавить columninterval в мой df. Это column должно вернуть year, содержащееся в date, но также, если оно H1 или H2. H1 составляет половину года, и должно быть все date значений между 01-dd-yy06-dd-yy и, следовательно, H2 должно быть все date значений между 07-dd-yy и 12-dd-yy.Добавить столбец в dataframe на основе диапазона столбцов даты

Это пример данных в df['date']:

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... 

В df я хочу добавить еще один столбец с именем interval, содержащий:

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

Так я думал, что создать function и затем используйте 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.

Первый конвертер int год значение strastype, затем выберите последний 2 chars. Последнее использование 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 седловины итп:

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

это столбец 'дата' строка?Вы не можете сравнивать строки, как этот

преобразовать последние два элемента в строку в ИНТ

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

и, наконец,

df['interval'] = A