При работе с сериями дат pandas выделение номера недели может быть выполнено двумя отдельными способами, которые дают разные результаты.
Использование аксессора .dt.week
для значения numpy.datetime64 или pd.Period в серии приводит к результатам, отличным от использования pd.Period.strftime
для тех же объектов.Онлайн-документация для pd.Period.strftime гласит, что все дни до первого появления начальной недели в начале года считаются неделей 0. Это соответствует стандартному поведению python strftime.
Аксессор .dt.week
, кажется, начинается с 1 и перезапускается через 52 недели, что делает последние два дня 2018 недели 1 из 2019. В онлайн-документации для pd.Series.dt.week только указано, чтовозвращает порядковый номер недели в году.Похоже, это номер недели iso?
Почему существует такое расхождение в поведении двух методов?Какой из них следует использовать и почему?Как элегантно получить номер недели iso из одного объекта datetime (или pd.Period или pd.timestamp) в python (в отличие от серии)?
df2 = pd.DataFrame({"Date_string": ["2018-12-27", "2018-12-28","2018-12-29", "2018-12-30", "2018-12-31", "2019-01-01", "2019-01-02", "2019-01-03", "2019-01-04", "2019-01-05", "2019-01-06", "2019-01-07",]})
df2["Date_datestamp"] = pd.to_datetime(df2["Date_string"], format='%Y-%m-%d')
df2["Date_period"] = df2['Date_datestamp'].dt.to_period("D")
df2["Week1"] = df2['Date_period'].apply(lambda x: (x + timedelta(days=1)).week)
df2["Week2"] = df2['Date_period'].apply(lambda x: x.strftime("%U"))
df2
возвращает
Date_string Date_datestamp Date_period Week1 Week2
0 2018-12-27 2018-12-27 2018-12-27 52 51
1 2018-12-28 2018-12-28 2018-12-28 52 51
2 2018-12-29 2018-12-29 2018-12-29 52 51
3 2018-12-30 2018-12-30 2018-12-30 1 52
4 2018-12-31 2018-12-31 2018-12-31 1 52
5 2019-01-01 2019-01-01 2019-01-01 1 00
6 2019-01-02 2019-01-02 2019-01-02 1 00
7 2019-01-03 2019-01-03 2019-01-03 1 00
8 2019-01-04 2019-01-04 2019-01-04 1 00
9 2019-01-05 2019-01-05 2019-01-05 1 00
10 2019-01-06 2019-01-06 2019-01-06 2 01
11 2019-01-07 2019-01-07 2019-01-07 2 01