我在python中有一个带有这些标题的数据框
GP 2016-Dec 2017-Jan 2017-Feb 2017-Mar 2017-Apr 2017-May 2017-Jun 2017-Jul 2017-Aug 2017-Sep 2017-Oct 2017-Nov
我希望将其更改为
GP 2017-Jan 2017-Feb 2017-Mar 2017-Apr 2017-May 2017-Jun 2017-Jul 2017-Aug 2017-Sep 2017-Oct 2017-Nov 2017-Dec
所以我创建了一个数组,其中包含我要替换的日期
new_date = [u'2017-Jan', u'2017-Feb', u'2017-Mar', u'2017-Apr', u'2017-May', u'2017-Jun', u'2017-Jul', u'2017-Aug', u'2017-Sep', u'2017-Oct', u'2017-Nov', u'2017-Dec']
和旧日期的数组
old_date = Index([u'2016-Dec', u'2017-Jan', u'2017-Feb', u'2017-Mar', u'2017-Apr',
u'2017-May', u'2017-Jun', u'2017-Jul', u'2017-Aug', u'2017-Sep',
u'2017-Oct', u'2017-Nov'],
dtype='object')
然后进行一个循环,逐个更改每一列。
j = 0
for i in new_date:
print old_date[j] + ' : ' + i
df.rename(columns={old_date[j] : i}, inplace=True)
j = j + 1
,最终结果是
GP 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec
所以,我的周期不起作用的原因是因为当我重命名我的第一列" 2016-Dec"到" 2017-Jan",新数据框将如下所示
GP 2017-Jan 2017-Jan 2017-Feb 2017-Mar 2017-Apr 2017-May 2017-Jun 2017-Jul 2017-Aug 2017-Sep 2017-Oct 2017-Nov
它将有两列名称" 2017-Jan"然后下一个循环开始,程序将重命名名称为" 2017-Jan"的所有列。到" 2017-Feb" ......等等。
所以真正的问题是我不知道如何修复它,或者是否有更直接的方法可以立即更改所有列。希望有人能让我高兴!谢谢!
答案 0 :(得分:0)
假设您的dataframe
被称为df
,请尝试以下操作:
from dateutil.relativedelta import relativedelta
df.columns = [(pd.to_datetime(df.columns[i]) + relativedelta(months=1)).strftime(format="%Y-%b") for i in range(0, len(df.columns))]
基本上代码的作用是在列索引的各个元素上循环,并且每个元素执行以下操作:
datetime
datetime
string
)"%Y-%b"
醇>
答案 1 :(得分:0)
而不是每次在for循环中重命名列。你可以建立一个映射旧日期和新日期的字典,然后使用该字典重命名。请参阅下面的示例
old_date =[u'2016-Dec', u'2017-Jan', u'2017-Feb']
df = pd.DataFrame.from_records([(1,2,3)],columns = old_date)
print df
'''
2016-Dec 2017-Jan 2017-Feb
0 1 2 3
'''
new_date = [u'2017-Jan', u'2017-Feb', u'2017-Mar']
map_dict = {}
for o,n in zip(old_date,new_date):
map_dict[o] = n
print map_dict
'''
{u'2016-Dec': u'2017-Jan', u'2017-Jan': u'2017-Feb', u'2017-Feb': u'2017-Mar'}
'''
df.rename(columns=map_dict, inplace=True)
print df
'''
2017-Jan 2017-Feb 2017-Mar
0 1 2 3
'''