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

Posted

技术标签:

【中文标题】获取 Pandas 系列的一周的第一天【英文标题】:Get the first day of the week for a Pandas series 【发布时间】:2018-12-14 22:55:15 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

太快了!谢谢【参考方案2】:

很遗憾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)

【讨论】:

+!对于答案,但是sunday 应该是第一天吧? 没错,我只是重新生成了原始代码的行为。我想这只是从df["Day_of_Week"] = df.Date.dt.weekday 中添加/减去1 的问题 熊猫认为星期一是一周的第一天? 是的,datetime.date(2018,7,9).weekday() 返回0【参考方案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

【讨论】:

weekdaydayofweek 相同吗? 我的意思是他可以省略 df["Day_of_Week"] = df.Date.dt.weekday 好吧。 df.Date.dt.weekdaydf.Date.dt.dayofweek 给出相同的结果,那么两个函数是否相同?【参考方案4】:

您可以留在 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)。这就是说,“如果工作日已经为零,则什么也不做;否则,返回该周的星期一。”

【讨论】:

【参考方案5】:

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.TimedeltaIndex, pd.to_datetime

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

【讨论】:

以上是关于获取 Pandas 系列的一周的第一天的主要内容,如果未能解决你的问题,请参考以下文章

来自 HTML5 Intl API 的一周的第一天

在objective-c中获取一周的第一天和最后一天

在 SQL Server 中获取一周的第一天

如何在Oracle中生成一周的第一天,一周的最后一天和两个日期之间的周数

仅获取从一周的第一天到一周的当前日期的数据

Bigquery 自定义一周的第一天(默认为星期一)