kasperhj
kasperhj

Reputation: 10482

Getting a date from a week number

I am trying to get a date based on a number of the week, but there are some annoyances.

The date.weekday() returns the day of the week where 0 in Monday and 6 is Sunday.

The %w directive of date.strftime() and date.strptime() uses the 0 for Sunday and 6 for Saturday.

This causes some really annoying issues when trying to figure out a date given a week number from date.weekday().

Is there a better way of getting a date from a week number?

EDIT:

Added the example.

import datetime

original_date = datetime.date(2014, 8, 24)
week_of_the_date = original_date.isocalendar()[1] # 34
day_of_the_date = original_date.isocalendar()[2] # 7
temp = '{0} {1} {2}'.format(*(2014, week_of_the_date, day_of_the_date-1))
date_from_week = datetime.datetime.strptime(temp, '%Y %W %w')
week_from_new_date = date_from_week.isocalendar()[1] # 35!!

EDIT 2:
I ultimately put the date stuff in the view (using jQuery UI), it has more consistent notions of weeks.

Upvotes: 4

Views: 1680

Answers (1)

Peter DeGlopper
Peter DeGlopper

Reputation: 37319

I think the Sunday vs. Monday distinction between weekday and strftime using %W is moot - you could use isoweekday to get those to line up, or %U in strftime if you wanted Sunday as the first day of the week. The real problem is that strftime, based on the underlying C function, determines the first week of the year differently than the ISO definition. With %W the docs say: " All days in a new year preceding the first Monday are considered to be in week 0". ISO calendars count the week containing the first Thursday as the first week, for reasons I do not understand.

Two ways I found to work with ISO weeks, either just getting datetime.date instances back or supporting a variety of operations, are:

  1. this answer with a simple timedelta approach: What's the best way to find the inverse of datetime.isocalendar()?
  2. this third-party library: https://pypi.python.org/pypi/isoweek/

Upvotes: 2

Related Questions