我试图将以下时间序列中的日期索引更改为月份名称。
website = dfFinal.groupby(['Date','Website'])
websiteGroup = website['Visits'].aggregate(np.sum).unstack()
Website A B C
Date
2015-01-01 18185 805769 NaN
2015-02-01 73236 944458 NaN
2015-03-01 101737 1003966 NaN
2015-04-01 101018 861229 NaN
2015-05-01 77724 845223 NaN
2015-06-01 111503 966043 NaN
2015-07-01 115413 937184 NaN
2015-08-01 115215 890457 1649
例如,我希望它看起来像这样:
Website A B C
Date
January 18185 805769 NaN
February 73236 944458 NaN
March 101737 1003966 NaN
April 101018 861229 NaN
May 77724 845223 NaN
June 111503 966043 NaN
July 115413 937184 NaN
August 115215 890457 1649
我希望能够这样,所以我的情节标记将是月份名称而不是日期时间。
谢谢
编辑//
相同的方案,但解决方案不起作用:
systemType = dfFinal.groupby(['Date','Website','Type'])
systemGroup = systemType['Visits'].aggregate(np.sum)
systemGroup = systemGroup.groupby(level=[0,1]).apply(lambda x: 100*x/float(x.sum())).unstack()
Type Other Windows Mobile Windows PC
Date Website
2015-01-01 A 0.637888 0.005499 48.814957
B 0.686549 0.016506 54.176073
2015-02-01 A 0.742804 0.020482 49.811568
B 0.651802 0.014506 57.014288
2015-03-01 A 0.668390 0.014744 50.087972
B 0.573924 0.015937 59.906013
2015-04-01 A 0.662258 0.015839 49.310024
B 0.583933 0.013469 59.490449
2015-05-01 A 0.666461 0.020586 48.522979
B 0.577954 0.017983 58.838200
systemGroup = systemGroup.rename(index=lambda x: x.strftime('%B'))
给了我一个错误
AttributeError: 'str' object has no attribute 'strftime'
如果您有DatetimeIndex,则可以使用
websiteGroup.rename(index=lambda x: x.strftime('%B'))
.rename
可以使用函数,我们将使用'%B'
代码作为完整的月份名称。
websiteGroup.index = websiteGroup.index.strftime('%B')
print (websiteGroup)
A B C
January 18185 805769 NaN
February 73236 944458 NaN
March 101737 1003966 NaN
April 101018 861229 NaN
May 77724 845223 NaN
June 111503 966043 NaN
July 115413 937184 NaN
August 115215 890457 1649.0
df = websiteGroup.set_index(websiteGroup.index.strftime('%b'))
print (df)
A B C
Jan 18185 805769 NaN
Feb 73236 944458 NaN
Mar 101737 1003966 NaN
Apr 101018 861229 NaN
May 77724 845223 NaN
Jun 111503 966043 NaN
Jul 115413 937184 NaN
Aug 115215 890457 1649.0
另外,为了在索引中分配新值,可以使用set_index
:
df = websiteGroup.set_index(websiteGroup.index.strftime('%B'))
print (df)
A B C
January 18185 805769 NaN
February 73236 944458 NaN
March 101737 1003966 NaN
April 101018 861229 NaN
May 77724 845223 NaN
June 111503 966043 NaN
July 115413 937184 NaN
August 115215 890457 1649.0
编辑:
对于版本pandas 0.23.0
可能使用DatetimeIndex.month_name
:
websiteGroup.index = websiteGroup.index.month_name()
print (websiteGroup)
A B C
Website
January 18185 805769 NaN
February 73236 944458 NaN
March 101737 1003966 NaN
April 101018 861229 NaN
May 77724 845223 NaN
June 111503 966043 NaN
July 115413 937184 NaN
August 115215 890457 1649.0
您可以使用datetime.strptime
解析每个日期字符串,并使用datetime.strftime('%B')
打印月份名称:
>>> d = datetime.datetime.strptime('2015-01-01', '%Y-%m-%d')
>>> d.strftime('%B')
'January'
Pandas版本0.23.0及以后(截至本文时,它为0.24.2)提供了一种内置方法:.month_name
。来自its official documentation:
pandas.DatetimeIndex.month_name
返回具有指定语言环境的DateTimeIndex的月份名称。
考虑以下DataFrame:
aapl.tail()
# returns:
Attributes High Low Open Close Volume Adj Close
2019-03-27 189.76 186.55 188.75 188.47 29848400.0 188.47
2019-03-28 189.56 187.53 188.95 188.72 20780400.0 188.72
2019-03-29 190.08 188.54 189.83 189.95 23564000.0 189.95
2019-03-30 190.08 188.54 189.83 189.95 23564000.0 189.95
2019-03-31 190.08 188.54 189.83 189.95 23564000.0 189.95
DataFrame有一个DateTimeIndex,所以我们可以在索引上应用.month_name
,如下所示:
aapl.index = aapl.index.month_name()
aapl.tail()
# returns:
Attributes High Low Open Close Volume Adj Close
March 189.76 186.55 188.75 188.47 29848400.0 188.47
March 189.56 187.53 188.95 188.72 20780400.0 188.72
March 190.08 188.54 189.83 189.95 23564000.0 189.95
March 190.08 188.54 189.83 189.95 23564000.0 189.95
March 190.08 188.54 189.83 189.95 23564000.0 189.95
在0.23.0之前你会使用.month()
和其他参考使用.strftime('%B')
的答案是要走的路。