2017-01-16 9 views
3

列の名前が文字列形式の日付(年 - 月)であるデータフレームがあります。これらの名前をdatetime形式でどのように変換できますか? 私はこれをやってみました:データフレーム列名を文字列形式から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) 

はまた、期間に変換可能です:jezraelの答えに展開として

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

、元のコードは、new_colsおよびsに格納された配列によってdf配列をスライスしようとします結果をdfとして上書きしますが、これらの値はdfに存在しないため、スライスするインデックスを見つけることができないというエラーが返されます。

このように、jezraelの回答のように、列の名前を変更する必要があることを宣言する必要があります。

関連する問題