我有一个带有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
有没有办法跟踪累计周数?
答案 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