Python日期和時間處理(三) - 週數轉換

週數的轉換

  • 日期轉換週數
    當我們需要獲取特定日期對應的週數的時候,通常我們使用如下方法:
from datetime import date
dt1 = date(2018, 10, 10)
dt2 = date(2018, 12, 31)
dt1.strftime("%V")   # output: '41'
dt2.strftime("%V")  # output '1'

可以看出週數顯示的沒有問題,但是對於d2,如果沒有year會讓我們無法清楚到底是2018年還是2019年的第一週,這會導致程序的一些錯誤。爲避免這種混亂,我們需要一個函數來同時返回year和週數。

def get_week_number(dt):
    """get both year and week number of a specified date object
    
    :param dt: date or datetime object which you want to corresponding get week number
    :return: a tuple including both year and week number. (year, week_num)
    """
    year = dt.year
    month = dt.month
    week_num = int(dt.strftime("%V"))
    if dt.month == 12 and week_num == 1:
        return year + 1, week_num
    return year, week_num

調用結果如下:

get_week_number(d2)
# output: (2019, 1)
  • 通過週數轉化爲特定日期
    週數轉化爲特定日期時,我們其實不僅需要週數,還需要year和一週的第幾天,這樣才能知道具體是那一天,即:
    • year
    • week number
    • 一週的第幾天

最先想到的方法是如下方法:

dt3 = datetime.strptime("2018-41-3", "%Y-%W-%w")
dt3  # output:  datetime.datetime(2018, 10, 10, 0, 0)

dt4 = datetime.strptime("2019-1-1", "%Y-%W-%w")
dt4  # output:  datetime.datetime(2019, 1, 7, 0, 0)

dt5 = datetime.strptime("2018-41-0", "%Y-%W-%w")
dt5  # output:  datetime.datetime(2018, 10, 14, 0, 0)

上面的示例dt3轉換沒有問題,但是對於dt4可以看出並不是我們想要的結果,我們會發現python在這裏有一個bug的(當然也許只是計算方式不對,不論怎樣,這裏並沒有遵循ISO的標準進行轉換)。

另外一個問題是當我們想要獲取第0天時,實際對應的是第7天(即週日)

解決這個問題需要安裝一個新的第三方包isoweek,如下:

pip install isoweek

之後使用如下方法來獲取對應的日期:

from isoweek import Week

dt6 = Week(2019, 1).monday()
dt6  # output: datetime.date(2018, 12, 31)

我們看到使用isoweek包,我們可以正確的將week number轉化爲對應的日期。另外需要說明的是iso的標準是從週一開始到週日。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章