Reputation: 4739
I am trying to change my Date index in the following time series to the month name.
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
for example I want it to look like this:
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
I want to be able to this so my plot ticks will be the month name instead of the datetime.
Thanks
edit//
same scenario but solution does not work on it:
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'))
gives me an error
AttributeError: 'str' object has no attribute 'strftime'
Upvotes: 8
Views: 13465
Reputation: 9583
Pandas version 0.23.0 and onwards (as of this writing, it's 0.24.2) provide a built-in method: .month_name
. From its official documentation:
pandas.DatetimeIndex.month_name
returns the month names of the DateTimeIndex with specified locale.
Consider the following 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
The DataFrame has a DateTimeIndex, so we can apply .month_name
on the index like so:
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
Prior to 0.23.0 you would use .month()
and other answers referencing the use of .strftime('%B')
is the way to go.
Upvotes: 1
Reputation: 862661
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
Also for assign new values in index is possible use 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
EDIT:
For versions pandas 0.23.0
is possible use 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
Upvotes: 2
Reputation: 146
You can parse each date string with datetime.strptime
and print the month name with datetime.strftime('%B')
:
>>> d = datetime.datetime.strptime('2015-01-01', '%Y-%m-%d')
>>> d.strftime('%B')
'January'
Upvotes: 0
Reputation: 28946
If you have a DatetimeIndex, you can use
websiteGroup.rename(index=lambda x: x.strftime('%B'))
.rename
can take a function, and we'll use the '%B'
code for the full month name.
Upvotes: 6