Calendar module in Python has the calendar class that allows the calculations for various task based on date, month, and year. On top of it, the TextCalendar and HTMLCalendar class in Python allows you to edit the calendar and use as per your requirement.
Let see what we can do with Python Calendar.
- Code Line # 1: We begin with "import calendar" which will import all the classes of this module.
- Code Line # 3: c= calendar.TextCalendar(calendar.SUNDAY) tells the interpreter to create a text calendar. Start of the month will be Sunday. In Python, you can format the calendar as you can change the day of the month to begin with
- Code Line # 4: str= c.formatmonth(2015,1) We are creating calendar for the year 2015, Month 1 – January
- Code Line # 5: print str will print the output.
Run the code.
Let's quickly change the value from Sunday to Thursday and check the output
Step 2: You can also print out the Calendar in HTML format, this feature is helpful for developer if they want to make any changes in the look and feel of calendar
Step 3: Loops over the days of a month by using c.itermonthday (2015,4), it will fetch the total number of days for that month.
- When you execute the code to get the total number of days for a specific month say "April" then you will get 31 days in the output but you will also see some zeros along with these days at the beginning and sometimes at the end of it.
- Zeros in the output mean that the day of the week is in an overlapping month, which means it does not belong to that month.
- These zeros appears in output because, in your code you have mentioned day (Thursday), so when you call function "c.itermonthdays" , it will start counting days from Thursday and your Thursday is not necessary to start with date 1st of April it might be 28th or 29th of march, so when you execute the code it will start counting days from 28th of march and any days after that till 1st of April. These days will be counted as zero and in the output you will see these zeroes and same is applicable to the end of the month.
- So except date 1-31 all the dates from previous as well as post month will appear in the output as zeroes.
Step 4: You can fetch the data from the local system, like months or weekdays, etc
- The output over here shows that we have printed out the months name from the local system. Likewise, you can also fetch the weekdays name as shown below
- The output will depend on the local system, suppose if your local system is some other countries then it will give the output as per the local settings of that country. Here we have months so it won't be a difference but if it is a week or day, it will certainly differ.
Step 5: You can fetch the list of the specific day for a whole year. For example, there is an audit day on every first Monday of a week, and want to know the date for each month of the year, you can use this code
- mycal = calendar.monthcalendar(2020, month) will create calendar for the month
- Set variables week1 and week2 to the First and second week of the calendar
- Check if Week 1 contains Monday, set audit day
- Else set audit day as the first Monday in week 2
- The output shows the date for the first Monday that falls in that month.
- The length of this Cal object is going to be a certain length, based on how many weeks there in the month. In our case, it's going to be one or two as such first Monday of the week will be in the first week most often but if not then consider the second week. Let see in detail why we also consider the second week.
- Here we are using the calendar's constant Monday, the calendar object gives you constants that represent Sunday, Monday, Tuesday, so on, so forth. We've seen these previously. So, if in week one the day represented by the Monday constant is not equal to 0, remember zeros means days that belong to another month. So, in this case, if it's zero, it's going to be a Monday that belongs to the previous month. But if the first Monday is not equal to 0, that means that my audit day will be within the week one. Otherwise, if that is 0, then the first Monday isn't in the first week of the month, it's gotta be in the second.
- So, then I say okay, set my audit day variable to be the Monday represented by Week two. So, audit day is going to come back with whatever the day is for either the first or second week.
Here is the complete code
import calendar #Create a plain text calendar c= calendar.TextCalendar(calendar.THURSDAY) str= c.formatmonth(2015,1,0,0) print str #Create an HTML formatted calendar hc = calendar.HTMLCalendar(calendar.THURSDAY) str = hc.formatmonth(2015, 1) print str #loop over the days of a month #zeroes indicate that the day of the week is in a next month or overlapping month for i in c.itermonthdays(2015,4): print i #The calendar can give info based on local such a names of days and months (full and abbreviated forms) for name in calendar.month_name: print name for day in calendar.day_name: print day #calculate days based on a rule: For instance an audit day on the second Monday of every month #Figure out what days that would be for each month, we can use the script as shown here for month in range(1,13): # It retrieves a list of weeks that represent the month mycal = calendar.monthcalendar(2020, month) # The second MONDAY has to be within the first two weeks week1 = mycal week2 = mycal if week1[calendar.MONDAY] != 0: auditday = week1[calendar.MONDAY] else: # if the second MONDAY isn't in the first week, it must be in the second week auditday = week2[calendar.MONDAY] print "%10s %2d" % (calendar.month_name[month], auditday)
- In Python, you can format the calendar the way you want as you can change the day of the month to begin
- Print out the Calendar in HTML format
- Fetch the data from the local system, like months or weekdays
- Fetch the list of the specific day for a whole year