编辑:下面的(令人费解的)行为是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。
答案 0 :(得分:1)
pd.Period(1970, freq='2D')
对我来说有预期的start_time
和end_time
,也使用了Pandas 0.18.1。也许尝试重新启动解释器,并再次运行您发布的第一段代码以验证您是否仍然获得意外输出?