Номер рабочей недели в Северной Америке Python от datetime? - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь получить номер рабочей недели из отметки времени в соответствии с этой системой:

США, Канада, большая часть Латинской Америки, Япония, Израиль, Южная Корея и другие используютсистема нумерации недель (называемая в нашем калькуляторе североамериканской), в которой первая неделя (номер 1) любого данного года - это неделя, которая содержит 1 января.Первый день недели - воскресенье, а суббота - последняя.

https://www.calendar -12.com / week_number

Метод Python strftime поддерживает %U и %W, но ни один из них не соответствует этой системе.Pandas также добавляет %V в соответствии с ISO 8601, но это не то, что используется в Северной Америке.

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Ниже приведен код, который я использовал в одном из моих проектов.Он основан на североамериканской системе нумерации недель, где первая неделя - это неделя, содержащая 1 января.

from datetime import date

def week1_start_ordinal(year):
    jan1 = date(year, 1, 1)
    jan1_ordinal = jan1.toordinal()
    jan1_weekday = jan1.weekday()
    week1_start_ordinal = jan1_ordinal - ((jan1_weekday + 1) % 7)
    return week1_start_ordinal

def week_from_date(date_object):
    date_ordinal = date_object.toordinal()
    year = date_object.year
    week = ((date_ordinal - week1_start_ordinal(year)) // 7) + 1
    if week >= 52:
        if date_ordinal >= week1_start_ordinal(year + 1):
            year += 1
            week = 1
    return year, week

Например:

>>> from datetime import date
>>> week_from_date(date(2015, 12, 27))
(2016, 1)
0 голосов
/ 13 апреля 2019

Хорошо, вот что я придумала ... было бы неплохо, если бы это было включено в datetime или Pandas, хотя

def US_week(ts):
    if pd.isnull(ts):
        return np.nan

    import datetime as dt
    U = int(ts.strftime('%U'))


    # If this is last week of year and next year starts with week 0, make this part of the next years first week
    if U == int(dt.datetime(ts.year, 12, 31).strftime('%U')) and int(
            dt.datetime(ts.year + 1, 1, 1).strftime('%U')) == 0:
        week = 1

    # Some years start with 1 not 0 (for example 2017), then U corresponds to the North American work week already
    elif int(dt.datetime(ts.year, 1, 1).strftime('%U')) == 1:
        week = U
    else:
        week = U + 1

    return week

def US_week_str(ts):
    week = US_week_str(ts)
    return "{}-{:02}".format(ts.year, week)
...