来自 to_datetime() 的奇怪行为
Strange behavior from to_datetime()
我在这里过得很艰难。
我的 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
我的目标是将 "Purchase Date" 列从字符串更改为日期时间对象,这样我就可以 运行 通过对它应用此函数来进行同期群分析:
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')
函数returns错误:'str'对象没有属性'year'
我尝试了以下函数并使用了所有参数(dayfirst,yearfirst ...)
data["Purchase_Date"] = pd.to_datetime(data["Purchase_Date"])
pd.to_datetime()
datetime.datetime.strptime()
我不断收到 ValueError: day is out of range for month
请大家帮忙
所以,你快到了:
data["Purchase_Date"] = pd.to_datetime(data["Purchase_Date"])
data['InvoiceMonth'] = data["Purchase_Date"].dt.strftime("%Y-%m-01")
(以 object
格式输出月份 - 您可以通过添加 pd.to_datetime(...)
将其转换为 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
)
两者都会 return,但我强烈推荐第一个选项:
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
该错误与 get_month
有关,因为首先您需要将 Purchase_Date
转换为日期时间系列:
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
您还可以使用 MonthBegin
获得 InvoiceMonth
,这样您就不必声明 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
我在这里过得很艰难。
我的 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
我的目标是将 "Purchase Date" 列从字符串更改为日期时间对象,这样我就可以 运行 通过对它应用此函数来进行同期群分析:
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')
函数returns错误:'str'对象没有属性'year' 我尝试了以下函数并使用了所有参数(dayfirst,yearfirst ...)
data["Purchase_Date"] = pd.to_datetime(data["Purchase_Date"])
pd.to_datetime()
datetime.datetime.strptime()
我不断收到 ValueError: day is out of range for month
请大家帮忙
所以,你快到了:
data["Purchase_Date"] = pd.to_datetime(data["Purchase_Date"])
data['InvoiceMonth'] = data["Purchase_Date"].dt.strftime("%Y-%m-01")
(以 object
格式输出月份 - 您可以通过添加 pd.to_datetime(...)
将其转换为 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
)
两者都会 return,但我强烈推荐第一个选项:
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
该错误与 get_month
有关,因为首先您需要将 Purchase_Date
转换为日期时间系列:
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
您还可以使用 MonthBegin
获得 InvoiceMonth
,这样您就不必声明 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