Weekday names in pandas

pandas
datetime
Author

Teresa Kubacka

Published

October 8, 2022

Pandas offers you a functionality to read the day of the week out of a datetime column: dt.weekday. However these are values ranging from 0..6. Is there a better way to convert them to human-readable days rather than using our real-world knowledge? (yes, there is!)

import pandas as pd 

generate the weekday names in a given locale

We can use the .dt.day_name() function to generate named days. This function alone gets us only to discover that 2018-01-01 was a Monday. But we can do the following:

  1. Generate 7 consecutive dates with pd.date_range()
  2. For each of them, read out its .dt.weekday
  3. For each of them, read out its .dt.day_name()
  4. Ignore/drop the first column and use the dataframe as a mapping between the integer denoting a day and its human-readable form.

Bonus: we can generate named days in a given locale. So for example to obtain a mapping between integers, day names in English, day names in German:

s = pd.DataFrame(pd.date_range(start='2018-01-01', freq='D', periods=7), columns=['date'])
s['weekday'] = s['date'].dt.weekday
s['weekday_en'] = s['date'].dt.day_name()
s['weekday_de'] = s['date'].dt.day_name(locale='de')
s 
date weekday weekday_en weekday_de
0 2018-01-01 0 Monday Montag
1 2018-01-02 1 Tuesday Dienstag
2 2018-01-03 2 Wednesday Mittwoch
3 2018-01-04 3 Thursday Donnerstag
4 2018-01-05 4 Friday Freitag
5 2018-01-06 5 Saturday Samstag
6 2018-01-07 6 Sunday Sonntag

We can add variations of weekday names, such as:

s['weekday_short'] = s['weekday_en'].apply(lambda x: x[0:3]).str.upper()

We can also create a dictionary:

weekday_dict = s[['weekday', 'weekday_short']].set_index('weekday_short')['weekday'].to_dict()
weekday_dict
{'MON': 0, 'TUE': 1, 'WED': 2, 'THU': 3, 'FRI': 4, 'SAT': 5, 'SUN': 6}