Странное поведение от to_datetime () - PullRequest
3 голосов
/ 02 мая 2020

Мне действительно было тяжело здесь.

Мой DataFrame выглядит следующим образом

     Purchase_Date     Customer_ID  Gender  
0   2012-12-18 00:00:00   7223        F 
1   2012-12-20 00:00:00   7841        M     
2   2012-12-21 00:00:00   8374        F

Моя цель - изменить столбец «Дата покупки» со строки на объект даты и времени, чтобы я мог запустить когортный анализ, применив к нему эту функцию :

      def get_month(x): return dt.datetime(x.year, x.month, 1)
      data['InvoiceMonth'] = data['Purchase_Date'].apply(get_month)
      grouping = data.groupby('Customer_ID')['InvoiceMonth']
      data['CohortMonth'] = grouping.transform('min')

функция возвращает ошибку: Объект 'str' не имеет атрибута 'year' Я пробовал следующие функции и играл со всеми аргументами (dayfirst, yearfirst ...)

data["Purchase_Date"] = pd.to_datetime(data["Purchase_Date"])
pd.to_datetime()
datetime.datetime.strptime()

Я продолжаю получать ValueError: день вне диапазона для месяца

Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Ошибка связана с get_month, потому что сначала вам нужно преобразовать Purchase_Date в дату-время ser ie:

import datetime as dt
data.Purchase_Date = pd.to_datetime(data.Purchase_Date, format='%Y-%m-%d %H:%M:%S')
data['Purchase_Date'].apply(get_month)

# 0   2012-12-01
# 1   2012-12-01
# 2   2012-12-01

Вы также можете получить InvoiceMonth, используя MonthBegin, поэтому вам не нужно объявлять get_month

from pd.tseries.offset import MonthBegin

data.Purchase_Date = pd.to_datetime(data.Purchase_Date, format='%Y-%m-%d %H:%M:%S')
data['InvoiceMonth'] = data.Purchase_Date - MonthBegin(1)

data['InvoiceMonth']
# 0   2012-12-01
# 1   2012-12-01
# 2   2012-12-01
0 голосов
/ 03 мая 2020

Итак, вы были почти на месте:

data["Purchase_Date"] = pd.to_datetime(data["Purchase_Date"])
data['InvoiceMonth'] = data["Purchase_Date"].dt.strftime("%Y-%m-01")

(выводит месяц в формате object - вы можете преобразовать его в datetime, добавив pd.to_datetime(...))

Или альтернативно - используя ваш подход:

data["Purchase_Date"] = pd.to_datetime(data["Purchase_Date"])

import datetime as dt

def get_month(x): return dt.datetime(x.year, x.month, 1)

data['InvoiceMonth'] = data["Purchase_Date"].apply(get_month)

(выводит месяц как datetime)

Оба вернутся, хотя я настоятельно рекомендую первый вариант:

  Purchase_Date  Customer_ID Gender InvoiceMonth
0    2012-12-18         7223      F   2012-12-01
1    2012-12-20         7841      M   2012-12-01
2    2012-12-21         8374      F   2012-12-01
...