【问题标题】:How to get python to recognize "YYYY W##" as date time object and then fill add time objects less than a certain week如何让python将“YYYY W##”识别为日期时间对象,然后填充添加时间对象少于某一周
【发布时间】:2018-05-20 23:54:54
【问题描述】:

我有一个数据框,其中包含 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 不是传统的日期时间对象,我不确定如何让 python 识别 2016 W16 发生在 2016 W17 之前,然后只填充值 before valuedf 中声明的星期。

我不知道从哪里开始,所以如果有人可以帮助我将 value 转换为一个很棒的日期时间对象,我可以从那里开始。任何其他见解表示赞赏。

我发现了这个堆栈溢出问题,这是我目前所知道的:Match rows in one Pandas dataframe to another based on three columns

【问题讨论】:

  • 鉴于您的星期值的字符串结构按重要性较高的顺序排序,任何字典比较都可以工作(即"2016 W15" < "2016 W28" 评估为True)。我不确定我是否理解您的确切问题。我将不得不重新阅读您的问题几次...

标签: python pandas numpy datetime dataframe


【解决方案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

【讨论】:

  • 我收到错误 ValueError: cannot reindex from a duplicate axis。你知道那是什么吗?
  • @JAG2024 检查你的start_end_weeks,是否有重复?
  • dfvalue列中只有重复值。
  • reindex(['2016... 中的实际值不是线性的。就像他们从2016 W 19 跳到2016 W 25 一样,如果这有影响的话。 @文
  • @JAG2024 如果我的第二部分对您有用,您可以使用第一部分将其转换为日期时间
【解决方案2】:

你可以得到一个有效的datetime日期如下:

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

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 2021-02-03
    • 2021-03-26
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2019-06-02
    相关资源
    最近更新 更多