熊猫将部分列索引转换为日期时间

时间:2020-10-10 11:05:45

标签: python pandas dataframe indexing

下面的DataFrame包含1996年至2016年的房价数据集。

除了前6列之外,其他列也需要转换为Datetime类型。

DataFrame's columns of housing price dataset

我尝试运行以下代码:

HousingPrice.columns[6:] = pd.to_datetime(HousingPrice.columns[6:])

但是我得到了错误:

TypeError: Index does not support mutable operations

我希望将索引列中的某些列转换为Datetime类型,而不是所有列。

1 个答案:

答案 0 :(得分:1)

pandas index是不可变的,因此您不能这样做。

但是,您可以使用array访问和修改列索引,请参阅文档here

HousingPrice.columns.array[6:] = pd.to_datetime(HousingPrice.columns[6:])

应该工作。

请注意,这只会更改列索引。为了转换列值,您可以执行以下操作:

date_cols = HousingPrice.columns[6:]
HousingPrice[date_cols] = HousingPrice[date_cols].apply(pd.to_datetime, errors='coerce', axis=1)

编辑

示例:

data = {'0ther_col': [1,2,3], '1996-04': ['1996-04','1996-05','1996-06'], '1995-05':['1996-02','1996-08','1996-10']}

print('ORIGINAL DATAFRAME')
df = pd.DataFrame.from_records(data)
print(df)

print("\nDATE COLUMNS")

date_cols = df.columns[-2:]
print(df.dtypes)

print('\nCASTING DATE COLUMNS TO DATETIME')

df[date_cols] = df[date_cols].apply(pd.to_datetime, errors='coerce', axis=1)
print(df.dtypes)

print('\nCASTING DATE COLUMN INDEXES TO DATETIME')

print("OLD INDEX -", df.columns)
df.columns.array[-2:] = pd.to_datetime(df[date_cols].columns)
print("NEW INDEX -",df.columns)

print('\nFINAL DATAFRAME')
print(df)

产量:

ORIGINAL DATAFRAME
   0ther_col  1995-05  1996-04
0          1  1996-02  1996-04
1          2  1996-08  1996-05
2          3  1996-10  1996-06

DATE COLUMNS
0ther_col     int64
1995-05      object
1996-04      object
dtype: object

CASTING DATE COLUMNS TO DATETIME
0ther_col             int64
1995-05      datetime64[ns]
1996-04      datetime64[ns]
dtype: object

CASTING DATE COLUMN INDEXES TO DATETIME
OLD INDEX - Index(['0ther_col', '1995-05', '1996-04'], dtype='object')
NEW INDEX - Index(['0ther_col', 1995-05-01 00:00:00, 1996-04-01 00:00:00], dtype='object')

FINAL DATAFRAME
   0ther_col 1995-05-01 00:00:00 1996-04-01 00:00:00
0          1          1996-02-01          1996-04-01
1          2          1996-08-01          1996-05-01
2          3          1996-10-01          1996-06-01