将月份名称和年份合并到列中 pandas python

noo*_*oob 3 python calendar pandas

df

Year   Month Name    Avg
2015    Jan           12
2015    Feb           13.4
2015    Mar           10     
...................
2019   Jan           11
2019   Feb           11
Run Code Online (Sandbox Code Playgroud)

代码

df['Month Name-Year']= pd.to_datetime(df['Month Name'].astype(str)+df['Year'].astype(str),format='%b%Y')
Run Code Online (Sandbox Code Playgroud)

在数据帧 df 中,groupby 输出 avg 位于键月份名称和年份上。所以月份名称和年份实际上是多级索引。我想创建第三列“月份名称年份”,以便我可以使用数据进行一些操作(创建绘图等)。

我使用代码得到的输出如下:

   Year   Month Name    Avg        Month Name-Year
   2015    Jan           12       2015-01-01
   2015    Feb           13.4     2015-02-01
   2015    Mar           10       2015-03-01
    ...................
    2019   Nov           11       2019-11-01
    2019   Dec           11       2019-12-01
Run Code Online (Sandbox Code Playgroud)

等等。

我想要的输出是“月份名称-年份”列中的 2015-Jan、2015-Feb 等...或者我想要 2015-01、2015-02...2019-11、2019-12 等(只有年份和月份,没有天)。

请帮忙

jez*_*ael 6

一种解决方案是转换为日期时间,然后通过Series.dt.to_period或更改格式Series.dt.strftime

df['Month Name-Year']=pd.to_datetime(df['Month Name']+df['Year'].astype(str),format='%b%Y')

#for months periods
df['Month Name-Year1'] = df['Month Name-Year'].dt.to_period('m')
#for 2010-02 format
df['Month Name-Year2'] = df['Month Name-Year'].dt.strftime('%Y-%m')
Run Code Online (Sandbox Code Playgroud)

最简单的解决方案是不转换为日期时间,仅将-年份连接并转换为字符串:

#format 2010-Feb
df['Month Name-Year3'] = df['Year'].astype(str) + '-' + df['Month Name']
Run Code Online (Sandbox Code Playgroud)

...与转换为日期时间然后转换为自定义字符串相同:

#format 2010-Feb
df['Month Name-Year31'] = df['Month Name-Year'].dt.strftime('%Y-%b')
Run Code Online (Sandbox Code Playgroud)