我一直试图从多个列标签为日期的Excel文件中导入数据。 excel文件标题看起来像这样
将其导入数据框后,我得到了列标签-
所以我想从标题中删除小时。由于日期会在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']
答案 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: []