查看Python Pandas

时间:2015-12-24 15:07:05

标签: python datetime pandas

我有一个带有日期时间列的Pandas数据帧。我的问题如下:

我的开始日期是2014年8月4日。从那时起,我计算了16周的时间。因此,从2014年8月4日到2014年8月11日,它将是第1周。在16周之后,它将从第1周开始。我想创建一个新列,它将找到当前块的周基于日期时间列。

这就是我所做的,但它似乎无法正常工作。

startingweek = datetime.date(2014, 8, 4)

df['WeekChunk'] = int(((df['DateTimeColumn'] - startingweek) / pd.offsets.Day(1))/7/16)

我计算了两天之间的天数,然后除以7天找到周数,然后再除以16来找到大块的一周。

如果我使用2015年12月23日的日期,那应该是第9周。但是,上面的代码似乎错了。

2 个答案:

答案 0 :(得分:1)

如果您需要16周期的一周,则需要模数,而不是偏差。所以改变" /"到"%"。并在此之前获取int()。

df['WeekChunk'] = int(((df['DateTimeColumn'] - startingweek) / pd.offsets.Day(1))/7) % 16

P.S。但第一周将是0,而不是1。

答案 1 :(得分:0)

这是一种使用内置numpy / pandas时间序列功能而不使用模运算符的方法:

import pandas as pd
import numpy as np

# re-create a dummy df with a Date column for this example
startingweek = datetime.date(2014, 8, 4)
df = pd.DataFrame(pd.date_range(startingweek, periods=1000, freq='D'), columns=['Date'])

# calc the WeekChunks by recasting the differences into timedelta periods
df['WeekChunks'] = 1 + (df.Date-startingweek).astype(np.timedelta64(1,'W'))
                     - (df.Date-startingweek).astype(np.timedelta64(1,'16W'))*16

# find Dec 23, 2015...should be WeekChunks = 9
df.set_index('Date').ix['2015-12-23']

WeekChunks    9
Name: 2015-12-23 00:00:00, dtype: float64