重新采样时的时间戳装箱机制



我不太清楚如何确定DataFrame.resample中的bin成员身份。

示例/实际输出:

>>> df = pd.DataFrame(index=pd.date_range(start='2021-04-21 01:00:00', end='2021-04-28 01:00', freq='1d'), data=[1]*8)
>>> df
0
2021-04-21 01:00:00  1
2021-04-22 01:00:00  1
2021-04-23 01:00:00  1
2021-04-24 01:00:00  1
2021-04-25 01:00:00  1
2021-04-26 01:00:00  1
2021-04-27 01:00:00  1
2021-04-28 01:00:00  1
>>> df.resample(rule='7d', origin='2021-04-29 00:00:00', closed='right', label='right').sum() 
0
2021-04-22  2
2021-04-29  6

预期输出:

0
2021-04-22  1
2021-04-29  7

推理:

我原以为熊猫会创建两个

(2021-04-15 00:00:00, 2021-04-22 00:00:00]
(2021-04-22 00:00:00, 2021-04-29 00:00:00]

以及时间戳2021-04-21 01:00:00落入第一仓,而2021-04-22 01:00:00和剩余的时间戳应当落入第二仓。


edit:我刚刚意识到使用24*7=168小时而不是7天会产生预期的结果。为什么?

>>> df.resample(rule='168h', origin='2021-04-22 00:00:00', closed='right', label='right').sum() 
0
2021-04-22  1
2021-04-29  7

我正在使用熊猫1.3.5

从源代码中,我添加了一行调试代码来理解

def _get_time_bins(self, ax: DatetimeIndex):
# XXX: Debug - pandas/core/resample.py#L1630
print(f"binner: {binner}nbins: {bins}nlabels: {labels}nbin_edges: {bin_edges}")
return binner, bins, labels

您的尝试:

>>> df.resample(rule='7d', origin='2021-04-29 00:00:00', closed='right', label='right').sum()
# Debug
binner: DatetimeIndex(['2021-04-15', '2021-04-22', '2021-04-29'], dtype='datetime64[ns]', freq='7D')
bins: [2 8]
labels: DatetimeIndex(['2021-04-22', '2021-04-29'], dtype='datetime64[ns]', freq='7D')
bin_edges: [1618531199999999999 1619135999999999999 1619740799999999999]
# Result
0
2021-04-22  2
2021-04-29  6

获得预期结果:

>>> df.resample(rule='7d', origin='2021-04-29 00:00:00', closed='left', label='right').sum()
# Debug
binner: DatetimeIndex(['2021-04-15', '2021-04-22', '2021-04-29'], dtype='datetime64[ns]', freq='7D')
bins: [1 8]
labels: DatetimeIndex(['2021-04-22', '2021-04-29'], dtype='datetime64[ns]', freq='7D')
bin_edges: [1618444800000000000 1619049600000000000 1619654400000000000]
# Result
0
2021-04-22  1
2021-04-29  7

我刚刚意识到,使用24*7=168小时而不是7天会产生预期的结果。为什么?

>>> df.resample(rule='168h', origin='2021-04-22 00:00:00', closed='right', label='right').sum()
# Debug
binner: DatetimeIndex(['2021-04-15', '2021-04-22', '2021-04-29'], dtype='datetime64[ns]', freq='168H')
bins: [1 8]
labels: DatetimeIndex(['2021-04-22', '2021-04-29'], dtype='datetime64[ns]', freq='168H')
bin_edges: [1618444800000000000 1619049600000000000 1619654400000000000]
# Result:
0
2021-04-22  1
2021-04-29  7

事实上,我认为Pandas首先根据规则'D''H'中的单位截断日期时间。我想为什么"7D"one_answers"168H"的行为不同。也许你应该向github公开一个问题。

相关内容

  • 没有找到相关文章

最新更新