Pandas Series.dt.week против pd.Period.strftime - какая разница? - PullRequest
0 голосов
/ 29 января 2019

При работе с сериями дат 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

1 Ответ

0 голосов
/ 29 января 2019

Это потому, что в 2018 году было 53 недели. Я бы порекомендовал использовать комбинацию год-неделя, например.

df2['Year-Week'] = df2['Date_period'].apply(lambda x: x.strftime('%Y-%U'))

Отредактировано: чтобы узнать количество недель, вы можете попробовать

df2["Week2"] = df2['Date_period'].apply(lambda x: x.strftime("%W"))

Показывает 2018-12-31 как неделю 53.

  • % U - получает номер недели, используя воскресенье в качестве первого дня недели
  • % W- получает номер недели, используя понедельник в качестве первого дня недели
...