【问题标题】:Creating week variable in pandas with custom start day for week使用自定义开始日期在熊猫中创建周变量
【发布时间】:2017-09-04 22:24:53
【问题描述】:

我有以下 Pandas 数据帧索引到 Time_Stamp:

df = DataFrame(index = pd.date_range('4/1/2017', freq='3D', periods=10))
df['weekday'] = df.index.weekday_name

数据如下所示:

              weekday
2017-04-01   Saturday
2017-04-04    Tuesday
2017-04-07     Friday
2017-04-10     Monday
2017-04-13   Thursday
2017-04-16     Sunday
2017-04-19  Wednesday
2017-04-22   Saturday
2017-04-25    Tuesday
2017-04-28     Friday

我想创建一个新列“week”,它将给出一年中的第几周,但有一个工作日。

我知道我可以这样做:

df['week_sun'] = df.index.week

除了我希望一周的第一天是星期日以外的其他日子。对于这个问题,假设我需要它是星期三,以便生成的数据框如下所示:

              weekday  week_sun  week_wed
2017-04-01   Saturday        13        13
2017-04-04    Tuesday        14        13
2017-04-07     Friday        14        14
2017-04-10     Monday        15        14
2017-04-13   Thursday        15        15
2017-04-16     Sunday        15        15
2017-04-19  Wednesday        16        16
2017-04-22   Saturday        16        16
2017-04-25    Tuesday        17        16
2017-04-28     Friday        17        17

我不知道如何实现这一目标。谢谢!

【问题讨论】:

  • 您能否详细说明您希望通过 week_wed 专栏实现的目标?

标签: python python-3.x pandas


【解决方案1】:

根据您的要求,您只需将周数减去 1,以防一周中的哪一天在参考日“之前”(在您的示例中为星期三)。

In [162]: df
Out[162]: 
              weekday  week_sun
2017-04-01   Saturday        13
2017-04-04    Tuesday        14
2017-04-07     Friday        14
2017-04-10     Monday        15
2017-04-13   Thursday        15
2017-04-16     Sunday        15
2017-04-19  Wednesday        16
2017-04-22   Saturday        16
2017-04-25    Tuesday        17
2017-04-28     Friday        17

In [163]: df['week_wed'] = df['week_sun']

现在让我们在需要的地方移动值,这意味着工作日在星期三之前,因此df.index.dayofweek < 2

In [164]: df.loc[df.index.dayofweek < 2, 'week_wed'] = (df[df.index.dayofweek < 2]['week_sun'] - 2) % 52 + 1

In [165]: df
Out[165]: 
              weekday  week_sun  week_wed
2017-04-01   Saturday        13        13
2017-04-04    Tuesday        14        13
2017-04-07     Friday        14        14
2017-04-10     Monday        15        14
2017-04-13   Thursday        15        15
2017-04-16     Sunday        15        15
2017-04-19  Wednesday        16        16
2017-04-22   Saturday        16        16
2017-04-25    Tuesday        17        16
2017-04-28     Friday        17        17

我没有准确地减去 1,而是使用了模运算 ((X-2) %52 +1)),因此如果需要,我可以将前一年的第 1 周转换为第 52 周:

              weekday  week_sun  week_wed
2017-12-27  Wednesday        52        52
2017-12-30   Saturday        52        52
2018-01-02    Tuesday         1        52
2018-01-05     Friday         1         1

【讨论】:

    猜你喜欢
    • 2020-10-21
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    相关资源
    最近更新 更多