2017-01-10 4 views
1

Предположим, у меня есть очень простой dataframe:питон: получение столбец дат из столбцов лет-месяцев-дней

>>> a 
Out[158]: 
    monthE yearE dayE 
0  10 2014 15 
1  2 2012 15 
2  2 2014 15 
3  12 2015 15 
4  2 2012 15 

Предположим, что я хочу, чтобы создать столбец с датой, связанной с каждой строкой, используя три столбца целых чисел. Когда у меня есть простые числа достаточно, чтобы сделать, как:

>>> datetime.date(1983,11,8) 
Out[159]: datetime.date(1983, 11, 8) 

Если я должен создать столбец дат (теоретически очень простой запрос), вместо того, чтобы:

a.apply(lambda x: datetime.date(x['yearE'],x['monthE'],x['dayE'])) 

я получаю следующее ошибка:

KeyError: ('yearE', u'occurred at index monthE')

ответ

3

Я думаю, что можно сначала удалить последний символ E, а затем использовать to_datetime, но затем получить pandas timestamps не python dates:

df.columns = df.columns.str[:-1] 
df['date'] = pd.to_datetime(df) 
#if multiple columns filter by subset 
#df['date'] = pd.to_datetime(df[['year','month','day']]) 
print (df) 
    month year day  date 
0  10 2014 15 2014-10-15 
1  2 2012 15 2012-02-15 
2  2 2014 15 2014-02-15 
3  12 2015 15 2015-12-15 
4  2 2012 15 2012-02-15 

print (df.date.dtypes) 
datetime64[ns] 

print (df.date.iloc[0]) 
2014-10-15 00:00:00 

print (type(df.date.iloc[0])) 
<class 'pandas.tslib.Timestamp'> 

Спасибо MaxU для решения:

df['date'] = pd.to_datetime(df.rename(columns = lambda x: x[:-1])) 
#if another columns in df 
#df['date'] = pd.to_datetime(df[['yearE','monthE','dayE']].rename(columns=lambda x: x[:-1])) 
print (df) 
    monthE yearE dayE  date 
0  10 2014 15 2014-10-15 
1  2 2012 15 2012-02-15 
2  2 2014 15 2014-02-15 
3  12 2015 15 2015-12-15 
4  2 2012 15 2012-02-15 

Но если действительно нужно python dates добавить axis=1 к apply, но тогда невозможно использовать некоторые панды функции:

df['date'] =df.apply(lambda x: datetime.date(x['yearE'],x['monthE'],x['dayE']), axis=1) 
print (df) 
    monthE yearE dayE  date 
0  10 2014 15 2014-10-15 
1  2 2012 15 2012-02-15 
2  2 2014 15 2014-02-15 
3  12 2015 15 2015-12-15 
4  2 2012 15 2012-02-15 

print (df.date.dtypes) 
object 

print (df.date.iloc[0]) 
2014-10-15 

print (type(df.date.iloc[0])) 
<class 'datetime.date'> 
+1

Я думаю, что мы может переименовывать столбцы «на лету»: 'df ['date'] = pd.to_datetime (df.rename (columns = lambda x: x [: - 1]))', поэтому мы можем сохранить исход имена столбцов – MaxU

Смежные вопросы