从日期时间更改列标签格式

时间:2018-08-30 09:12:58

标签: python pandas datetime dataframe label

我一直试图从多个列标签为日期的Excel文件中导入数据。 excel文件标题看起来像这样

名称2018-08-01 2018-08-02金额

将其导入数据框后,我得到了列标签-

名称2018-08-01 00:00:00 2018-08-02 00:00:00金额

所以我想从标题中删除小时。由于日期会在excel文件中自动更新,因此我无法使用' df ['2018-08-01 00:00:00']`我尝试使用以下代码重命名列

df1.columns[3] =  pd.to_datetime(df1.columns[3], format='%Y-%m-%d')

但这会产生以下错误:

TypeError: Index does not support mutable operations.

我也尝试过

df1.rename(df1.columns[3][lambda t: t.strftime('%Y-%M-%d')])

哪个出现以下错误

TypeError: 'datetime.datetime' object is not subscriptable

我对Python和数据框非常陌生,但我仍处于基础阶段。我该如何完成?


已解决

我已经知道列索引,所以我将它们从datetime object转换为 string然后切成薄片。我尝试了迭代,但是它没有用,所以这是我唯一的方法。

Edate=str(df1.columns[1])
Edatep=slice(0,10,1)
Gdate=str(df1.columns[2])
Gdatep=slice(0,10,1)

df1.columns=['Name',Edate[Edatep],Gdate[Gdatep],'Amount']

1 个答案:

答案 0 :(得分:0)

大熊猫的索引是一成不变的-最好的选择是创建一个新索引。

我认为这里list comprehension可以很好地与timestamps一起转换if-else

df1 = pd.DataFrame(columns=['Name', pd.Timestamp('2018-08-01'), 
                             pd.Timestamp('2018-08-02'), 'Amount'])
print (df1)
Empty DataFrame
Columns: [Name, 2018-08-01 00:00:00, 2018-08-02 00:00:00, Amount]
Index: []

print (df1.columns.map(type))
Index([                                     <class 'str'>,
       <class 'pandas._libs.tslibs.timestamps.Timestamp'>,
       <class 'pandas._libs.tslibs.timestamps.Timestamp'>,
                                            <class 'str'>],
      dtype='object')

df1.columns=[x.strftime('%Y-%M-%d') if isinstance(x,pd.Timestamp) else x for x in df1.columns]
print (df1)
Empty DataFrame
Columns: [Name, 2018-00-01, 2018-00-02, Amount]
Index: []

如果输入数据为字符串的另一种解决方案:

df1.columns = df1.columns.astype(str)

df1.columns = df1.columns.astype(str).str.replace(' 00:00:00', '')
print (df1)
Empty DataFrame
Columns: [Name, 2018-08-01, 2018-08-02, Amount]
Index: []

cols = pd.to_datetime(df1.columns, errors='coerce')
df1.columns = df1.columns.where(cols.isnull(), cols.strftime('%Y-%M-%d'))

print (df1)

Empty DataFrame
Columns: [Name, 2018-00-01, 2018-00-02, Amount]
Index: []