Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If I were to pick the 5th Wednesday of each month, how screwy would our schedule be?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import calendar\n",
- "\n",
- "from itertools import islice\n",
- "from collections import defaultdict\n",
- "\n",
- "def itermonthday2_trunc(year, month):\n",
- " cal = calendar.Calendar()\n",
- " for (date, wkday) in cal.itermonthdays2(year, month):\n",
- " if date > 0:\n",
- " yield (date, wkday)\n",
- "\n",
- "def weekdays_for_month(year, month):\n",
- " wkdays = defaultdict(list)\n",
- " for (date, wkday) in itermonthday2_trunc(year, month):\n",
- " wkdays[wkday].append(date)\n",
- " \n",
- " return wkdays"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "defaultdict(list,\n",
- " {0: [1, 8, 15, 22, 29],\n",
- " 1: [2, 9, 16, 23, 30],\n",
- " 2: [3, 10, 17, 24, 31],\n",
- " 3: [4, 11, 18, 25],\n",
- " 4: [5, 12, 19, 26],\n",
- " 5: [6, 13, 20, 27],\n",
- " 6: [7, 14, 21, 28]})"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "weekdays_for_month(2018,10)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Let's just make use of `calendar.monthrange` instead"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def nth_wkday_of_month(year, month, wkday, n):\n",
- " (wkday0, lastdate) = calendar.monthrange(year,month)\n",
- " \n",
- " date = (wkday-wkday0) % 7 + (n-1)* 7 + 1\n",
- " if date > lastdate:\n",
- " return None\n",
- " else:\n",
- " return date\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def year_month_iter(y0,m0):\n",
- " \"\"\"\n",
- " convenience iterator for march through the months\n",
- " allow for modulo\n",
- " \"\"\"\n",
- " m1 = (m0 - 1)\n",
- " \n",
- " while True:\n",
- " y = y0 + m1 // 12\n",
- " m = m1 % 12 + 1\n",
- " \n",
- " yield(y,m)\n",
- " \n",
- " m1 += 1\n",
- " "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2019/1/30\n",
- "2019/5/29\n",
- "2019/7/31\n",
- "2019/10/30\n",
- "2020/1/29\n",
- "2020/4/29\n",
- "2020/7/29\n",
- "2020/9/30\n",
- "2020/12/30\n",
- "2021/3/31\n",
- "2021/6/30\n",
- "2021/9/29\n",
- "2021/12/29\n",
- "2022/3/30\n",
- "2022/6/29\n",
- "2022/8/31\n",
- "2022/11/30\n",
- "2023/3/29\n",
- "2023/5/31\n",
- "2023/8/30\n",
- "2023/11/29\n",
- "2024/1/31\n",
- "2024/5/29\n",
- "2024/7/31\n",
- "2024/10/30\n",
- "2025/1/29\n",
- "2025/4/30\n",
- "2025/7/30\n",
- "2025/10/29\n",
- "2025/12/31\n",
- "2026/4/29\n",
- "2026/7/29\n",
- "2026/9/30\n",
- "2026/12/30\n",
- "2027/3/31\n",
- "2027/6/30\n",
- "2027/9/29\n",
- "2027/12/29\n",
- "2028/3/29\n",
- "2028/5/31\n",
- "2028/8/30\n",
- "2028/11/29\n"
- ]
- }
- ],
- "source": [
- "# 5th wednesdays of the month\n",
- "\n",
- "\n",
- "for (year, month) in islice(year_month_iter(2019,1),120):\n",
- " # looking for 5th wednesdays\n",
- " date = nth_wkday_of_month(year, month, 2, 5)\n",
- " if date is not None:\n",
- " print (\"{}/{}/{}\".format(year, month, date))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.6"
- },
- "toc": {
- "base_numbering": 1,
- "nav_menu": {},
- "number_sections": false,
- "sideBar": false,
- "skip_h1_title": false,
- "title_cell": "Table of Contents",
- "title_sidebar": "Contents",
- "toc_cell": false,
- "toc_position": {},
- "toc_section_display": false,
- "toc_window_display": false
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
- }
Add Comment
Please, Sign In to add comment