【问题标题】:Changing Column Label format from datetime to date将列标签格式从日期时间更改为日期
【发布时间】:2019-02-05 04:14:50
【问题描述】:

我一直在尝试从多个列标签为日期的 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']

【问题讨论】:

    标签: python pandas datetime dataframe label


    【解决方案1】:

    pandas 中的索引是不可变的——最好的办法是创建一个新索引。

    我认为这里 list comprehension 工作得很好,只转换 timestampsif-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: []
    

    【讨论】:

    • 我不能这样做,因为日期每天都会改变,所以我需要每天设置列名。
    • @Tasnuva - 不明白,如果使用df1.columns = [x.strftime('%Y-%M-%d') if isinstance(x, pd.Timestamp) else x for x in df1.columns],它也会动态地改变日期时间。
    • 对不起,我不认为我明白了。我试过了,但它不起作用。我仍然知道时间。空数据框、列、索引 - 这些是正确的语法吗?因为如果我使用它会给出语法错误。
    • @Tasnuva - 是的,有时如果从所以复制语法错误,因为错误复制了一些''。仅尝试重写解决方案。
    • 不,它没有。结果和以前一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2020-02-19
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    相关资源
    最近更新 更多