熊猫将周日转换为周末周日日期

时间:2017-01-20 15:27:43

标签: python date pandas

我有一个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

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用内置的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

这里它保留了最后一行

答案 1 :(得分:0)

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

1)从您想要调整的日期的工作日减去您希望一周结束的那一天的工作日(0-7)。在这种情况下(对于Python),星期五= 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')代码。如果我没有做过任何拼写错误,你应该看周五= 0天,周六= -6天,周日= -5天等。你可以通过{{{{{{ 1}}而不是%7。星期五仍然等于0天,星期六= 1天,星期日= 2天等等。整洁的技巧,嗯?

这非常适合放在后面,因为它通常可以在任何地方进行一些小调整,但软件会在工作日编号。