我不太清楚如何确定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公开一个问题。