【问题标题】:Pandas datetime index cumulative weekPandas 日期时间索引累计周
【发布时间】:2018-04-21 21:35:05
【问题描述】:

我有一个带有 datetimeindex 的数据框。

>>> df.head() 
Out[6]: 
                                1
2004-01-02 09:00:00+11:00  0.7519
2004-01-02 10:00:00+11:00  0.7520
2004-01-02 12:00:00+11:00  0.7515
2004-01-02 13:00:00+11:00  0.7502
2004-01-02 14:00:00+11:00  0.7519

我想跟踪周数。我不知道是否可能缺少某些日子,所以不能简单地将条目数除以 7。

如果我执行以下操作,我会得到一年内的周数:

df['temp']= df.index.week
df[df.index.year==2005].head()
Out[20]: 
                                1  temp
2005-01-03 10:00:00+11:00  0.7829     1
2005-01-03 11:00:00+11:00  0.7815     1
2005-01-03 12:00:00+11:00  0.7814     1
2005-01-03 13:00:00+11:00  0.7797     1
2005-01-03 14:00:00+11:00  0.7731     1

这样做的问题是,周在 52 结束,而下一年又从 1 开始。我以为我可以按年份和周数分组以获得累计周数,但同一周可能会落入 2 年,例如

>>> df[df.index.year==2008].resample('d').tail()
Out[30]: 
                                  1  temp

2008-12-27 00:00:00+11:00  0.683678    52
2008-12-28 00:00:00+11:00       NaN   NaN
2008-12-29 00:00:00+11:00  0.689414     1
2008-12-30 00:00:00+11:00  0.690654     1
2008-12-31 00:00:00+11:00  0.691058     1

>>> df[df.index.year==2009].resample('d').head()
Out[29]: 
                                  1  temp
2009-01-01 00:00:00+11:00  0.695833     1
2009-01-02 00:00:00+11:00  0.697680     1
2009-01-03 00:00:00+11:00  0.705733     1
2009-01-04 00:00:00+11:00       NaN   NaN
2009-01-05 00:00:00+11:00  0.711436     2

有没有办法记录累计周数?

【问题讨论】:

    标签: python pandas datetime pandas-groupby


    【解决方案1】:

    Ken Wei 的解决方案不完整的原因是周数从前一年开始,但大部分发生在明年,pandas 属性是第一个,您可以在下面的示例中看到:

                  weekIndex  weekNum
    <DTYYYYMMDD>                    
    2001-12-28       200152       52
    2001-12-31       200101        1
    2002-01-02       200201        1
    2002-01-03       200201        1
    

    如您所见,已重复一周。

    作为解决方案,我建议使用创建列表的循环,这很容易转换为 pandas DataFrame:

    df['weekNum'] = df.index.week
    
    last_x = 0
    numerator = 0
    cumWeek = list()
    
    for x in df['weekNum']:
        if x != last_x:
            numerator += 1
            cumWeek.append(numerator)
        else:
            cumWeek.append(numerator)
        last_x = x
    
    cumWeek = pd.DataFrame(cumWeek, columns=['cumWeek'], index=df.index)
    df = pd.concat([df, cumWeek], axis=1)
    

    cumWeek 单独存储所需的输出。

    【讨论】:

      【解决方案2】:

      同时使用周和年:

      df['week_no'] = df.index.week + (df.index.year - df.index.year.min()) * 52
      

      【讨论】:

      • 你希望它给什么?
      【解决方案3】:

      这是一个可能的解决方案,可能不是很好。欢迎任何改进。

      df['temp']= df.index.week
      df.loc[(df.temp == 1) & (df.index.month == 12), 'temp'] = 53
      df.loc[(df.temp == 52) & (df.index.month == 1), 'temp'] = 0
      df['cum_wk'] = df.temp + (df.index.year - df.index.year.min()) * 52
      

      【讨论】:

        猜你喜欢
        • 2014-03-07
        • 1970-01-01
        • 2021-02-18
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 2017-08-13
        • 2019-06-22
        • 2017-08-25
        相关资源
        最近更新 更多