熊猫日期时间指数累计周

时间:2017-11-09 01:44:50

标签: python pandas datetime pandas-groupby

我有一个带有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

有没有办法跟踪累计周数?

3 个答案:

答案 0 :(得分:0)

使用周和年:

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

答案 1 :(得分:0)

肯威的解决方案之所以不完整,是因为该年度是从上一年开始的,而其中大多数发生在下一年,大熊猫属性是第一位,在下面的示例中可以看到:

              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 :(得分:-1)

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

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