2

我正在处理一个数据集,其中观察发生在开放时间和关闭时间之间——但服务在它打开后的第二天关闭。例如,早上 7 点开门,第二天凌晨 1 点关门。

这感觉像是一个非常普遍的问题——我已经四处寻找它并且对我可能只是不知道要搜索的正确术语的事实持开放态度。

对于我的大多数用途来说,执行以下操作就足够了:

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

然后我可以在 df 上做一些有趣的小团体:
df.groupby(open_close.asof).agg(func).

但是我遇到了一个实例,我需要抓住多个这样的开闭期。我真正想做的只是有一个 DatetimeIndex ,我可以在其中选择一天的开始时间。所以我可以将“一天”重新定义为从早上 5 点到早上 5 点。这样做的好处是我可以使用类似的东西df[df.index.dayofweek == 6]并取回从周日早上 5 点到 Monda 早上 5 点的所有内容。

感觉就像 Periods ......或者 pandas 内部的东西预料到了这个请求。很想帮忙弄清楚。

编辑:

我还通过在正确的日子创建另一个专栏来解决这个问题
df['shift_day'] = df['datetime'].apply(magicFunctionToFigureOutOpenClose)
——所以这不会阻碍我的进步。感觉就像可以很好地集成到包中的东西(或日期时间......或某处......)

4

1 回答 1

1

也许basedf.resample() 的参数会有所帮助:

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
于 2012-11-10T23:27:20.853 回答