【问题标题】:Create Bi-weekly Variable Based On A Custom Start-date根据自定义开始日期创建双周变量
【发布时间】:2020-10-21 00:16:09
【问题描述】:

我已经使用“get biweekly variable in python”做了一些简单的搜索,但还没有找到很多有用的帖子,所以我想在这里发布我的问题。

我有一个包含数万条记录的数据框。数据框包含整个会计年度的记录。每条记录都有一个日期时间变量CHECKIN_DATE_TIME。我想创建一个从 2019 年 6 月 30 日开始的双周变量。

ID       CHECKIN_DATE_TIME
1       2019-06-30 13:36:00
2       2019-06-30 14:26:00
3       2019-06-30 20:10:00
4       2019-06-30 21:27:00
....
51       2019-07-10 13:36:00
52       2019-07-10 10:26:00
53       2019-07-10 10:10:00
54       2019-07-10 23:27:00
....

我希望新的数据框看起来像这样,其中 2019 年 6 月 30 日至 2019 年 7 月 13 日为第 1 周,2019 年 7 月 14 日至 2019 年 7 月 27 日为第 2 周,依此类推,直到2020 年 6 月 28 日的结束日期。因此,Week 变量中有 26 周,每周代表 2 周的时间范围。

编辑并将星期范围内的最后一天分配给星期编号。

ID       CHECKIN_DATE_TIME       Week    Date
1       2019-06-30 13:36:00       1     7/13/2019
2       2019-06-30 14:26:00       1     7/13/2019
3       2019-06-30 20:10:00       1     7/13/2019
4       2019-06-30 21:27:00       1     7/13/2019
....
51       2019-07-20 13:36:00      2     7/27/2019
52       2019-07-20 10:26:00      2     7/27/2019
53       2019-07-20 10:10:00      2     7/27/2019
54       2019-07-20 23:27:00      2
....

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以通过确定入住日期和 2019 年 6 月 30 日之间的天数然后除以 14 来做到这一点。

    df['CHECKIN_DATE_TIME'] = pd.to_datetime(df.CHECKIN_DATE_TIME)    
    df['week'] = (df.CHECKIN_DATE_TIME - pd.datetime(2019, 6, 30)).dt.days // 14 + 1
    df['last_week_day'] = (pd.to_timedelta(-((df.CHECKIN_DATE_TIME - pd.datetime(2019,6,30)).dt.days % 14) + 13 ,'d') + df.CHECKIN_DATE_TIME).dt.date
    
    # note I've created my own test set.
    
       ID   CHECKIN_DATE_TIME  week last_week_day
    0   1 2019-06-30 13:36:00     1    2019-07-13
    1   2 2019-07-10 10:36:00     1    2019-07-13
    2   3 2019-07-12 02:36:00     1    2019-07-13
    3   4 2019-07-18 18:36:00     2    2019-07-27
    4   5 2019-07-30 11:36:00     3    2019-08-10
    5   6 2019-08-01 20:36:00     3    2019-08-10
    

    编辑:根据 cmets 中的请求添加 last_week_day。这是通过使用模运算符% 计算CHECKIN_DATE_TIME 列所需的天数来完成的。

    【讨论】:

    • 谢谢,但这会产生以下错误“TypeError: unsupported operand type(s) for -: 'str' and 'datetime.datetime'”
    • 啊,我假设 CHECKIN_DATE_TIME 的类型是日期时间,我已经更新了答案以将其转换为正确的类型。
    • 这可行,但最后一个与日期时间转换相关的错误警告:SettingWithCopyWarning:试图在数据帧的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value
    • 您很可能在运行此代码之前制作了原始数据帧的一部分,这与当前问题无关。这也只是一个警告,其可能的影响和解决方案请参见:dataquest.io/blog/settingwithcopywarning
    • 调整了此请求的答案,如果您将在共享环境中使用它,您可能希望稍微简化一下 oneliner 以提高可读性。
    【解决方案2】:

    使用 Pandas 的 date_range 函数可以非常简单有效地生成每周、每两周或每月的日期列表

    import pandas as pd
    from  datetime import date,datetime,timedelta
    
    date_rng=pd.date_range(start=date.today()-timedelta(weeks=53),end=date.today(), freq="2W-SAT")
    for i in date_rng: 
      print(i)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多