可以pandas.Period代表一个任意的时间跨度?

时间:2016-05-25 15:15:19

标签: python pandas

编辑:下面的(令人费解的)行为是pandas 0.17.1。它似乎固定在0.18.1。

有没有办法用pandas.Period表示任意时间跨度?

具体来说,我试图设法pandas.Period()代表任意 n - 天跨度(目标是制作多年Period)。

我尝试了一些事情,似乎玩freq参数让我或多或少地得到了我想要的东西。但是,在end_time参数具有乘数(如freq)的情况下,我对此期间的意外freq='2D'感到惊讶。

import pandas as pd

p = pd.Period(1970, freq='2D')
p  # Period('1970-01-01', '2D')

p.start_time  # Timestamp('1970-01-01 00:00:00')
p.end_time    # Timestamp('1970-01-04 23:59:59.999999999')
p.end_time - p.start_time
# Timedelta('3 days 23:59:59.999999')

为什么呢?那是4天,而不是2天。

然而:

p+1  # Period('1970-01-03', '2D')
(p+1).start_time  # Timestamp('1970-01-03 00:00:00')

所以,(p+1)给了我预期的时间(p开始后2天开始的时间段。)

但与end_time的交易是什么? freq='nD'与实际持续时间(以天为单位)之间的关系是什么?

def actual_span(n, unit='D'):
    p = pd.Period(1970, freq='{}{}'.format(n, unit))
    return p.end_time + pd.Timedelta(1) - p.start_time

x = pd.DataFrame({'d': range(1, 10)})
x['span'] = x.n.apply(actual_span)
print(x.set_index('n'))

#      span
# n        
# 1  1 days
# 2  4 days
# 3  9 days
# 4 16 days
# 5 25 days
# 6 36 days
# 7 49 days
# 8 64 days
# 9 81 days

为什么它是所请求天数的平方?

请注意(p+1).start_time是正确的(给我们n天)。

小字体:Python 3.51,Pandas 0.18.1 更正: 0.17.1。

1 个答案:

答案 0 :(得分:1)

pd.Period(1970, freq='2D')对我来说有预期的start_timeend_time,也使用了Pandas 0.18.1。也许尝试重新启动解释器,并再次运行您发布的第一段代码以验证您是否仍然获得意外输出?