首页 文章

如何让python将“YYYY W ##”识别为日期时间对象,然后填充少于一周的添加时间对象

提问于
浏览
1

我有一个数据框,包括列 Name (名称), value (2016年发生事件的那一周), binary (事件发生的指示,"1"),例如:

df 
    Name      value      binary
    apple     2016 W16   1
    orange    2016 W17   1
    melon     2016 W20   1
    berry     2016 W17   1
    lime      2016 W19   1

我有兴趣在此数据框中添加行,以便每个 Name (苹果,橙等)在事件发生前的几周内在 value 列中都有一个项目 . 同样,事件发生的那一周在 df 中被声明为 value 列 . 感兴趣的时间段是2016 W16和2016 W19之间的周数,例如:

start_end_weeks
     week
     2016 W16
     2016 W17
     2016 W18
     2016 W19

我的问题是我需要在2016年W16和2016年W19之间填充几周内未在 df 中表示的行 . 这就是我的意思:

df_result 
    Name      value      binary
    apple     2016 W16   1
    orange    2016 W16   0
    orange    2016 W17   1
    melon     2016 W16   0
    melon     2016 W17   0
    melon     2016 W18   0
    melon     2016 W19   0
    melon     2016 W20   1
    berry     2016 W17   1
    lime      2016 W19   1
    ...

但是由于 value 不是't a traditional date time object, I'我不知道如何让python认识到2016 W16发生在2016 W17之前,然后只在 valuevalue 中所述的周之前填充值 .

我在哪里开始遇到麻烦,所以如果有人能帮助我将 value 转换为一个很棒的日期时间对象,我可以从那里开始 . 任何其他见解赞赏 .

我发现这个堆栈溢出问题到目前为止我都是:Match rows in one Pandas dataframe to another based on three columns .

2 回答

  • 2

    您可以按如下方式获得有效的日期时间:

    from datetime import datetime
    
    df['year'] = df.value.str.split(' W').str[0]
    df['week'] = df.value.str.split(' W').str[1]
    df['date'] = df.apply(lambda x: datetime.strptime(
        x.year + '-' + x.week + '-0', '%Y-%W-%w'), axis=1)
    

    结果将是:

    Name    value  binary   year    week    date
    0   apple   2016 W16    1   2016    16      2016-04-24
    1   orange  2016 W17    1   2016    17      2016-05-01
    2   melon   2016 W20    1   2016    20      2016-05-22
    3   berry   2016 W17    1   2016    17      2016-05-01
    4   lime    2016 W19    1   2016    19      2016-05-15
    
  • 1

    如果您需要转换为日期

    import datetime
    df.value.apply(lambda x : datetime.datetime.strptime(x + '-0', "%Y W%W-%w"))
    Out[133]: 
    0   2016-04-24
    1   2016-05-01
    2   2016-05-22
    3   2016-05-01
    4   2016-05-15
    Name: value, dtype: datetime64[ns]
    

    没有改变我要使用的日期 reindexgroupby

    df1=df.groupby('Name')['binary','value'].apply(lambda x : x.set_index('value').\
               reindex(['2016 W16','2016 W17','2016 W18','2016 W19','2016 W20']))
    
    df1.loc[df1.groupby(level=0).binary.bfill().dropna().index].fillna(0).reset_index()
    Out[65]: 
          Name     value  binary
    0    apple  2016 W16     1.0
    1    berry  2016 W16     0.0
    2    berry  2016 W17     1.0
    3     lime  2016 W16     0.0
    4     lime  2016 W17     0.0
    5     lime  2016 W18     0.0
    6     lime  2016 W19     1.0
    7    melon  2016 W16     0.0
    8    melon  2016 W17     0.0
    9    melon  2016 W18     0.0
    10   melon  2016 W19     0.0
    11   melon  2016 W20     1.0
    12  orange  2016 W16     0.0
    13  orange  2016 W17     1.0
    

相关问题