Cha*_*s R 6 python datetime series pandas
我有以下df:
import pandas as pd
from datetime import datetime, timedelta
df = pd.DataFrame([
["A", "2018-08-03"],
["B", "2018-08-20"]
])
df.columns = ["Item", "Date"]
Run Code Online (Sandbox Code Playgroud)
我想得到我的df的每一行的一周的第一天.我试着这样做:
df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d')
df["Day_of_Week"] = df.Date.dt.weekday
df["First_day_of_the_week"] = df.Date - timedelta(days=df.Day_of_Week)
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误消息:
TypeError: unsupported type for timedelta days component: Series
Run Code Online (Sandbox Code Playgroud)
如何获得系列赛的第一天?我的预期结果是:
jpp*_*jpp 12
使用 NumPy 可以实现矢量化解决方案:
df['First_day'] = df['Date'] - df['Date'].dt.weekday * np.timedelta64(1, 'D')
print(df)
Item Date First_day
0 A 2018-08-03 2018-07-30
1 B 2018-08-20 2018-08-20
Run Code Online (Sandbox Code Playgroud)
不幸的是timedelta,我不支持矢量化形式,所以我会选择apply
df["First_day_of_the_week"] = df.apply(lambda x: x['Date'] - timedelta(days=x['Day_of_Week']), axis=1)
Run Code Online (Sandbox Code Playgroud)
编辑
timedelta 不支持矢量化参数但可以乘以矢量:)
df["First_day_of_the_week"] = df.Date - df.Day_of_Week * timedelta(days=1)
Run Code Online (Sandbox Code Playgroud)
这是一个不需要带有减法的 timedelta 或 lambda 函数的解决方案:
df['Date'].dt.to_period('W').dt.to_timestamp()
Run Code Online (Sandbox Code Playgroud)