取得Pandas系列每周的第一天

时间:2018-07-06 10:38:33

标签: python pandas datetime series

我有以下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"]

我想为我的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)

但是我收到了该错误消息:

TypeError: unsupported type for timedelta days component: Series

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

  • “ A”,“ 2018-08-03”,“ 2018-07-30”
  • “ B”,“ 2018-08-20”,“ 2018-08-20”

5 个答案:

答案 0 :(得分:5)

不幸的是,timedelta不支持矢量化形式,所以我会选择apply

df["First_day_of_the_week"] = df.apply(lambda x: x['Date'] - timedelta(days=x['Day_of_Week']), axis=1)

编辑

timedelta不支持向量化参数,但可以乘以向量:)

df["First_day_of_the_week"] = df.Date - df.Day_of_Week * timedelta(days=1)

答案 1 :(得分:3)

省去“星期几”计算,然后执行此操作。

df["First_day_of_the_week"] = df['Date'].apply(lambda x: (x - timedelta(days=x.dayofweek)))
print(df)

给予

  Item       Date First_day_of_the_week
0    A 2018-08-03            2018-07-30
1    B 2018-08-20            2018-08-20

答案 2 :(得分:3)

使用NumPy可以实现矢量化解决方案:

Object

答案 3 :(得分:2)

您可以留在熊猫并使用其DateOffset对象:

>>> from pandas.tseries.offsets import Week

>>> df.Date.where(df.Date.dt.weekday == 0, df.Date - Week(weekday=0))
0   2018-07-30
1   2018-08-20
Name: Date, dtype: datetime64[ns]

诀窍是您不必在工作日已经是星期一的情况下进行减法(工作日== 0)。这就是说,“如果工作日已经为零,则什么也不做;否则,返回该周的星期一。”

答案 4 :(得分:0)

recursFunction :: ([(Bool, Bool, Bool)], Int, Int) -> [[(Bool, Bool, Bool)]] recursFunction (l, _,_) = map pure l版本

pandas

输出:

df = pd.DataFrame({
    'Item': ['A', 'B'],
    'Date': ['2018-08-03', '2018-08-20']
})

df['Date'] = pd.to_datetime(df.Date) #Use pd.Timestamp
df.Date - pd.TimedeltaIndex(df.Date.dt.dayofweek,unit='d') 

有关使用的功能的文档:pd.TimedeltaIndexpd.to_datetime

使用日期和时间:Time Series / Date functionality