2012-11-08 53 views
2

我处理的,其中开启和关闭时间之间发生的观测数据集的小时 - 但服务在当天关闭它打开后。例如,开放时间为早上7点,第二天凌晨1点关闭。变化的开始和结束大熊猫时间戳

这感觉就像一个非常普遍的问题 - 我已搜索周围,并愿意接受这样的事实,我可能只是不知道正确的术语来搜索。

对于我的大部分用途的它足以这样做:

open_close = pd.DatetimeIndex(start='2012-01-01 05:00:00', periods = 15, offset='D') 

然后,我可以做的DF有趣的小groupbys:
df.groupby(open_close.asof).agg(func).

但我碰到的一个我需要抓住这些开放期的多个时段。我真正希望能够做的就是拥有一个DatetimeIndex,我可以在一天开始时选择。所以我可以重新定义'一天'是从早上5点到上午5点。关于这一点的好处是,我可以使用df[df.index.dayofweek == 6]之类的东西,并从周日早上5点到周日上午5点收到所有东西。

感觉就像时期......什么预期该请求大熊猫的内部。爱会帮助解决它。

编辑:

我也通过创建与天权
df['shift_day'] = df['datetime'].apply(magicFunctionToFigureOutOpenClose)
另一列想通了这一点 - 所以这不是挡住了我的进步。只是觉得喜欢的事,可以很好地集成到封装(或日期时间...或...某处)

回答

1

也许df.resample(的base参数)将有助于:

base : int, default 0 
    For frequencies that evenly subdivide 1 day, the "origin" of the 
    aggregated intervals. For example, for '5min' frequency, base could 
    range from 0 through 4. Defaults to 0 

下面是一个例如:

In [44]: df = pd.DataFrame(np.random.rand(28), 
....:   index=pd.DatetimeIndex(start='2012/9/1', periods=28, freq='H')) 

In [45]: df 
Out[45]: 
          0 
2012-09-01 00:00:00 0.970273 
2012-09-01 01:00:00 0.730171 
2012-09-01 02:00:00 0.508588 
2012-09-01 03:00:00 0.535351 
2012-09-01 04:00:00 0.940255 
2012-09-01 05:00:00 0.143483 
2012-09-01 06:00:00 0.792659 
2012-09-01 07:00:00 0.231413 
2012-09-01 08:00:00 0.071676 
2012-09-01 09:00:00 0.995202 
2012-09-01 10:00:00 0.236551 
2012-09-01 11:00:00 0.904853 
2012-09-01 12:00:00 0.652873 
2012-09-01 13:00:00 0.488400 
2012-09-01 14:00:00 0.396647 
2012-09-01 15:00:00 0.967261 
2012-09-01 16:00:00 0.554188 
2012-09-01 17:00:00 0.884086 
2012-09-01 18:00:00 0.418577 
2012-09-01 19:00:00 0.189584 
2012-09-01 20:00:00 0.577041 
2012-09-01 21:00:00 0.100332 
2012-09-01 22:00:00 0.294672 
2012-09-01 23:00:00 0.925425 
2012-09-02 00:00:00 0.630807 
2012-09-02 01:00:00 0.400261 
2012-09-02 02:00:00 0.156469 
2012-09-02 03:00:00 0.658608 

 

In [46]: df.resample("24H", how=sum, label='left', closed='left', base=5) 
Out[46]: 
          0 
2012-08-31 05:00:00 3.684638 
2012-09-01 05:00:00 11.671068 

In [47]: df.ix[:5].sum() 
Out[47]: 0 3.684638 

In [48]: df.ix[5:].sum() 
Out[48]: 0 11.671068 
+0

哎,这是一个很酷去groupby的路!但我已经可以分组了 - 当我需要获得多个时间段时,我的问题就出现了。比如说,我需要从周五早上5点到周五的最后三个“星期五”。开始认为我没有足够好地描述我的问题 - 将编辑。 – badgley

+0

没问题,遗憾的是错过了目标。困难的部分似乎是调整数据。既然解决了,那么下一个问题就是:如何获取Y天的最后一个X实例? ''df [df.index.dayofweek == Y] .ix [-X:]''工作吗? – Garrett

+0

这对我不起作用 - 这里的问题解决了我的核心问题。当你按照dayofweek进行筛选时,你可以做到这一点,因此你无法达到[上午12点DayofWeek1,上午12点DayofWeek2]定义的'整个'日子。 – badgley