Неправильный анализ дат в фрейме данных pandas

#python #pandas #datetime

Вопрос:

Здравствуйте, я пытаюсь изменить даты моего фрейма данных в формат, который я могу использовать для извлечения полезной информации. Набор данных поставляется с функцией «неделя», которая представлена в виде ДД/ММ/ГГ следующим образом:

 In [128]: df_train[['week', 'units_sold']]
Out[128]: 
            week  units_sold
0       17/01/11          20
1       17/01/11          28
2       17/01/11          19
3       17/01/11          44
4       17/01/11          52

 

Я изменил даты следующим образом:

 df_train['new_date'] = pd.to_datetime(df_train['week'])

        new_date  units_sold
0     2011-01-17        20.0
1     2011-01-17        28.0
2     2011-01-17        19.0
3     2011-01-17        44.0
4     2011-01-17        52.0
 

Используя созданную мной функцию «new_date», я сделал следующее для извлечения некоторой информации:

 df_train['weekday'] = df_train['new_date'].dt.weekofyear             #week day of the year
df_train['QTR'] = df_train['new_date'].apply(lambda x: x.quarter)    #current quarter of the year
df_train['month'] = df_train['new_date'].apply(lambda x: x.month)    #current month
df_train['year'] = df_train['new_date'].dt.year                      #current year
 

Однако при просмотре моих данных я сталкиваюсь с некоторыми ошибками. Например, определенная дата в моем наборе данных-07/02/11, которая должна переводиться в месяц 2. За исключением того, что мой анализ показывает, что месяц равен 7, что, как я знаю, неверно: см. запись 3483

 Out[127]: 
          week  month
18    17/01/11      1
1173  24/01/11      1
2328  31/01/11      1
3483  07/02/11      7
4638  14/02/11      2
 

Кто-нибудь может сказать мне, где я ошибся?
Любая помощь приветствуется!

Ответ №1:

Использовать dayfirst=True параметр:

 df_train['new_date'] = pd.to_datetime(df_train['week'], dayfirst=True)
 

А затем .dt аксессуар для повышения производительности, потому что в приложении есть петли под капотом:

 df_train['weekday'] = df_train['new_date'].dt.weekofyear #week day of the year
df_train['QTR'] = df_train['new_date'].dt.quarter    #current quarter of the year
df_train['month'] = df_train['new_date'].dt.month    #current month
df_train['year'] = df_train['new_date'].dt.year