The reason your code is only returning one day name is because weekday
will never match more than one string in the days
tuple and therefore won't add any of the days of the week that follow it [nor wrap around to those before it]. Even if it did somehow, it would still return them all as one long string because you're initializing result
to an empty string, not an empty list
.
Here's a solution that uses the datetime
module to create a list of all the
weekday names starting with "Monday" in the current locale's language. This list is then used to create another list of names in the desired order which is returned. It does the ordering by finding the index of designated day in the original list and then splicing together two slices of it relative to that index to form the result. As an optimization it also caches the locale's day names so if it's ever called again with the same current locale [a likely scenario], it won't need to recreate this
private list.
import datetime
import locale
def weekdays[weekday]:
current_locale = locale.getlocale[]
if current_locale not in weekdays._days_cache:
# Add day names from a reference date, Monday 2001-Jan-1 to cache.
weekdays._days_cache[current_locale] = [
datetime.date[2001, 1, i].strftime['%A'] for i in range[1, 8]]
days = weekdays._days_cache[current_locale]
index = days.index[weekday]
return days[index:] + days[:index]
weekdays._days_cache = {} # initialize cache
print[weekdays['Wednesday']]
# ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
Besides not needing to hard-code days names in the function, another advantage to using the datetime
module is that code utilizing it will automatically work in other languages. This can be illustrated by changing the locale and then calling the function with a day name in the corresponding language.
For example, although France is not my default locale, I can set it to be the current one for testing purposes as shown below. Note: According to this
Capitalization of day names article, the names of the days of the week are not capitalized in French like they are in my default English locale, but that is taken into account automatically, too, which means the weekday
name passed to it must be in the language of the current locale and is also case-sensitive. Of course you could modify the function to ignore the
lettercase of the input argument, if desired.
# set or change locale
locale.setlocale[locale.LC_ALL, 'french_france']
print[weekdays['mercredi']] # use French equivalent of 'Wednesday'
# ['mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'lundi', 'mardi']
My last post was about creating a list of times to choose in an appointment-type app. In that app I also have a list of the days of the week.
day_names = [
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
'Sunday',
]
And, as in my previous post, I wanted to generate this list programmatically. This is the snippet I came up with.
import calendar day_names = list[calendar.day_name]
I use this snippet in a calendar app. Let’s try an example.
import calendar
import datetime day_names = list[calendar.day_name]day_of_week = datetime.date[2017, 10, 18].weekday[]
day = day_names[day_of_week]print[day]
The day_of_week variable is an integer 0–6. The integer is then used as an index to find the corresponding day name. The result is:
Wednesday Process finished with exit code 0
I hope you enjoyed this article. This article is also available as a video on YouTube on my ZennDogg’s 2 Minute Snippet channel. Cheers!
corresponding to the day of the week. Here is the mapping of integer values to the days of the week.
# import Python's datetime module
import datetime
# weekdays as a tuple
weekDays = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
# Find out what day of the week is this year's Christmas
thisXMas = datetime.date[2017,12,25]
thisXMasDay = thisXMas.weekday[]
thisXMasDayAsString = weekDays[thisXMasDay]
print["This year's Christmas is on a {}".format[thisXMasDayAsString]]
# Find out what day of the week next new year is
nextNewYear = datetime.date[2018,1,1]
nextNewYearDay = nextNewYear.weekday[]
nextNewYearDayAsString = weekDays[nextNewYearDay]
print["Next new year is on a {}".format[nextNewYearDayAsString]]