簡體   English   中英

獲取 Pandas 系列的一周的第一天

[英]Get the first day of the week for a Pandas 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”

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

省略你的“星期幾”計算並執行此操作。

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

使用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

您可以留在Pandas並使用其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)的情況下進行減法。 這說,“在工作日已經為零的情況下,什么也不做;否則,返回那周的星期一。”

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') 

輸出:

0   2018-07-30
1   2018-08-20
dtype: datetime64[ns]

有關使用函數的文檔: pd.TimedeltaIndexpd.to_datetime

使用日期和時間: 時間序列/日期功能

這是一個不需要帶減法的 timedelta 或 lambda 函數的解決方案:

df['Date'].dt.to_period('W').dt.to_timestamp()

僅使用 pandas 的 jpp 答案的替代方案:

df_plot['first_date'] = df_plot['date'] - pd.to_timedelta(df_plot['date'].dt.weekday, unit='days')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM