【问题标题】:Pandas Convert Week Date to Weekend Friday Date熊猫将星期日期转换为周末星期五日期
【发布时间】:2017-06-05 15:30:28
【问题描述】:

我有一个 pandas 数据框,其中有一列日期如下:

DATE
01/16/2017
01/17/2017
01/18/2017
01/19/2017
01/20/2017

我需要将这些日期中的每一个转换为周末日期,即相应周的星期五日期。因此,添加一个新列,生成一个如下所示的数据框:

DATE       WEEK_ENDING
01/16/2017  01/20/2017
01/17/2017  01/20/2017
01/18/2017  01/20/2017
01/19/2017  01/20/2017
01/20/2017  01/20/2017

基本上我正在寻找解决这个问题的 Pandas 解决方案 for a date get the friday of the week ending

日期本身的格式并不重要。是否有内置函数可以做到这一点,还是我必须写一个?谢谢!

【问题讨论】:

  • 每天加 7 得到第一个星期五:f = lambda x: pd.date_range(x, periods = 7)[pd.date_range(x, periods=7).weekday_name == 'Friday'][0]; df.DATE.apply(f)

标签: python date pandas


【解决方案1】:

您可以使用内置的DateOffsets 来实现:

In [310]:
from pandas.tseries.offsets import *
df['WEEK ENDING'] = df['DATE'] + Week(weekday=4)
df

Out[310]:
        DATE WEEK ENDING
0 2017-01-16  2017-01-20
1 2017-01-17  2017-01-20
2 2017-01-18  2017-01-20
3 2017-01-19  2017-01-20
4 2017-01-20  2017-01-27

请注意,从技术上讲,因为最后一天是下周,所以您的日期字符串也需要先使用pd.to_datetime 转换为日期时间:

df['DATE'] = pd.to_datetime(df['DATE'])

您可以通过减去一周并使用where测试计算的偏移量是否与原始数据相同来修复最后一行:

In [316]:
from pandas.tseries.offsets import *
df['WEEK ENDING'] = df['DATE'].where( df['DATE'] == (( df['DATE'] + Week(weekday=4) ) - Week()), df['DATE'] + Week(weekday=4))
df

Out[316]:
        DATE WEEK ENDING
0 2017-01-16  2017-01-20
1 2017-01-17  2017-01-20
2 2017-01-18  2017-01-20
3 2017-01-19  2017-01-20
4 2017-01-20  2017-01-20

最后一行保持不变

【讨论】:

  • 发布了通用解决方案。
【解决方案2】:

您可以使用相当标准的数学算法。

1) 从您要调整的日期的工作日减去您希望一周结束的那一天的工作日 (0-7)。在本例中(对于 Python),Friday=4,因此您将从各个日期的工作日值中减去 4。

2) 获取步骤 1) 的结果,如果您希望该值返回到前一个星期五,则应用模数 7,如果您希望它返回到下一个星期五,则应用模数 -7。

3) 对 2) 的结果使用 pd.to_timedelta 并从您的日期中减去。

这变成了一个相当简单的公式(假设您将 pandas 导入为 pd):

    df['week_ending'] = df['date'] - pd.to_timedelta((df['date'].dt.weekday-4)%-7,unit='d')

如果您想查看实际的数学运算,只需单独运行 pd.to_timedelta((df['date'].dt.weekday-4)%-7,unit='d') 代码即可。如果我没有打错任何字,您应该看到 Fridays=0 天、Saturdays=-6 天、Sundays=-5 天等。您可以改用 %7 将日期移回上一个星期五的%-7。星期五仍然等于 0 天,星期六 = 1 天,星期日 = 2 天,等等。巧妙的把戏,嗯?

这很适合放在你的后兜里,因为它通常适用于任何地方,只需对软件进行一些小的调整即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多