获得Pandas系列的一周的第一天

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)

如何获得系列赛的第一天?我的预期结果是:

  • "A","2018-08-03","2018-07-30"
  • "B","2018-08-20","2018-08-20"

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)


kos*_*nik 6

不幸的是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)

  • 是的,`datetime.date(2018,7,9).weekday()`返回`0` (2认同)

Fer*_*ann 5

这是一个不需要带有减法的 timedelta 或 lambda 函数的解决方案:

df['Date'].dt.to_period('W').dt.to_timestamp()
Run Code Online (Sandbox Code Playgroud)