繁体   English   中英

如何在 python 中将列名从日期更改为月份名称-年份

[英]How to change column name from date to Month Name-year in python

我想将日期列更改为月份名称 - 年份,我正在使用以下代码

rows = []
sort = ''
for v in results:
    row = {'date':v['TimePeriod']['Start']}
    sort = v['TimePeriod']['Start']
    for i in v['Groups']:
        key = i['Keys'][0]
        if key in self.accounts:
            key = self.accounts[key][ACCOUNT_Name]
        row.update({key:int(float(i['Metrics']['UnblendedCost']['Amount']))}) 
    if not v['Groups']:
        row.update({'Total':int(float(v['Total']['UnblendedCost']['Amount']))})
    rows.append(row)  

    df = pd.DataFrame(rows)
        

df.set_index("Mon_Year", inplace= True)
df = df.fillna(0.0)
        
if Style == 'Change':
    dfc = df.copy()
    lastindex = None
    for index, row in df.iterrows():
        if lastindex:
            for i in row.index:
                try:
                    df.at[index,i] = dfc.at[index,i] - dfc.at[lastindex,i]
                except:
                    logging.exception("Error")
                    df.at[index,i] = 0
        lastindex = index
df = df.T
df = df.sort_values(sort, ascending=False)
self.reports.append({'Name':Name,'Data':df, 'Type':type})

并获得 output 作为

2021-02-01       2021-03-01        2021-04-01
 xxxxxx            xxxxx             xxxxx

需要 output

Feb-2021       Mar-2021        Apr-2021
 xxxxxx            xxxxx          xxxxx

有人可以帮忙吗? 我是 python 的新手

您可以使用pd.to_datetime()重新格式化日期格式的列标签,然后使用DatetimeIndex.strftime() ,如下所示:

(1)所有列的转换(所有列都是日期格式):

df.columns = pd.to_datetime(df.columns).strftime('%b-%Y')

演示

data = {'2021-02-01': [1, 2, 3], '2021-03-01': [11, 12, 13], '2021-04-01': [21, 22, 23]}
df = pd.DataFrame(data)


print(df)


   2021-02-01  2021-03-01  2021-04-01
0           1          11          21
1           2          12          22
2           3          13          23


df.columns = pd.to_datetime(df.columns).strftime('%b-%Y')


print(df)


   Feb-2021  Mar-2021  Apr-2021
0         1        11        21
1         2        12        22
2         3        13        23

(2) 仅对部分列进行换算:

在现实生活中,如果您的列标签并非都是日期格式,并且只想转换相关的列标签,您可以这样做:

假设您在日期中只有 3 列df.columns[1:4]带有列标签,您可以使用:

df.columns = df.columns[0:1].to_list() +  pd.to_datetime(df.columns[1:4]).strftime('%b-%Y').to_list() + df.columns[4:].to_list()

演示

data = {'ID': ['A001', 'A002', 'A003'], '2021-02-01': [1, 2, 3], '2021-03-01': [11, 12, 13], '2021-04-01': [21, 22, 23], 'Other': ['a', 'b', 'c']}
df = pd.DataFrame(data)

print(df)

     ID  2021-02-01  2021-03-01  2021-04-01 Other
0  A001           1          11          21     a
1  A002           2          12          22     b
2  A003           3          13          23     c


df.columns = df.columns[0:1].to_list() +  pd.to_datetime(df.columns[1:4]).strftime('%b-%Y').to_list() + df.columns[4:].to_list()


print(df)


     ID  Feb-2021  Mar-2021  Apr-2021 Other
0  A001         1        11        21     a
1  A002         2        12        22     b
2  A003         3        13        23     c

您可以使用 python 的datetime时间来获取所需格式的日期时间字符串。

from datetime import datetime

>>> datetime.strptime('2020-10-20', '%Y-%m-%d').strftime('%b-%Y')
   'Oct-2020'

给定一个 dataframe 像这样:

>>> df = pd.DataFrame({'2021-02-01':[1,2,3],'2021-03-01':[10,30,15],'2021-04-01':[-0.25,2.5,-0.35]})
>>> df
   2021-02-01  2021-03-01  2021-04-01
0           1          10       -0.25
1           2          30        2.50
2           3          15       -0.35

首先使用datetime.strptime将列名字符串转换为日期时间 object,然后使用datetime.strftime将日期时间 object 转换回所需格式的字符串并分配为column

您可以像这样创建新列名称的列表:

>>> df.columns = list(map(lambda x: x.strftime('%b-%Y'), map(lambda x: datetime.strptime(x, '%Y-%m-%d'), df.columns.to_list())))

或者可以直接在dataframe.columns属性上调用map方法

df.columns = df.columns.map(lambda x: datetime.strptime(x, '%Y-%m-%d')).map(lambda x: x.strftime('%b-%Y'))

PS : Remember the order of map , for python's native map function, it is from inner most to outer most, for dataframe's map method, it's from left to right.

OUTPUT

   Feb-2021  Mar-2021  Apr-2021
0         1        10     -0.25
1         2        30      2.50
2         3        15     -0.35

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM