2017-01-16 4 views
3

У меня есть дата-рамка, где имена столбцов - это даты (Год-месяц) в виде строк. Как преобразовать эти имена в формат datetime? Я попытался сделать это:Измените имена столбцов dataframe из формата строки в datetime

new_cols = pd.to_datetime(df.columns) 
df = df[new_cols] 

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

KeyError: "DatetimeIndex(
['2000-01-01', '2000-02-01', 
'2000-03-01', '2000-04-01', 
'2000-05-01', '2000-06-01', 
'2000-07-01', '2000-08-01',    
'2000-09-01', '2000-10-01', 
'2015-11-01', '2015-12-01', 
'2016-01-01', '2016-02-01', 
'2016-03-01', '2016-04-01', 
'2016-05-01', '2016-06-01', 
'2016-07-01', '2016-08-01'], 
dtype='datetime64[ns]', length=200, freq=None) not in index" 

Спасибо!

ответ

7

Если вы выбрали значение loc, значения столбцов не были изменены, поэтому получите KeyError.

Так что вам нужно назначить выход для columns:

df.columns = pd.to_datetime(df.columns) 

Пример:

cols = ['2000-01-01', '2000-02-01', '2000-03-01', '2000-04-01', '2000-05-01'] 
vals = np.arange(5) 
df = pd.DataFrame(columns = cols, data=[vals]) 
print (df) 
    2000-01-01 2000-02-01 2000-03-01 2000-04-01 2000-05-01 
0   0   1   2   3   4 

print (df.columns) 
Index(['2000-01-01', '2000-02-01', '2000-03-01', '2000-04-01', '2000-05-01'], dtype='object') 

df.columns = pd.to_datetime(df.columns) 

print (df.columns) 
DatetimeIndex(['2000-01-01', '2000-02-01', '2000-03-01', '2000-04-01', 
       '2000-05-01'], 
       dtype='datetime64[ns]', freq=None) 

Также можно преобразовать в период:

print (df.columns) 
Index(['2000-01-01', '2000-02-01', '2000-03-01', '2000-04-01', '2000-05-01'], dtype='object') 

df.columns = pd.to_datetime(df.columns).to_period('M') 

print (df.columns) 
PeriodIndex(['2000-01', '2000-02', '2000-03', '2000-04', '2000-05'], 
      dtype='period[M]', freq='M') 
1

В качестве расширения для ответа jezrael, тем исходный код будет пытаться разрезать массив df массивом, хранящимся в new_cols и s разорвать результат как df - но поскольку эти значения не существуют в df, но он возвращает ошибку, заявив, что не может найти этот индекс для среза.

Таким образом, вы должны заявить, что вы меняете имя столбцов, как в ответе Джераэля.