看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas.Interval 可以解决数字区间和时间区间的相关问题,它实现一个名为 Interval 的不可变对象,Interval 是一个有界的切片状间隔。
构建 Interval 对象方法如下
pd.Interval(left=0, right=5, closed='right')
参数介绍:
说明:
可以构建不同类型的间隔,例如数字:
iv = pd.Interval(left=0, right=5)
iv
'''
Interval(0, 5, closed='right')
'''
# 可以检查元素是否属于它
3.5 in iv # True
5.5 in iv # False
# 可以测试边界值
# closed ='right',所以0 <x <= 5
0 in iv # False
5 in iv # True
0.0001 in iv # True
要创建时间间隔,您可以使用时间戳记作为界限:
# 定义一个 2020 年的区间
year_2020 = pd.Interval(pd.Timestamp('2020-01-01 00:00:00'),
pd.Timestamp('2021-01-01 00:00:00'),
closed='left')
# 指定时间是否在2020年区间里
pd.Timestamp('2020-01-01 00:00') in year_2020
# True
# 2020 年时间区间的长度
year_2020.length
# Timedelta('366 days 00:00:00')
还可以创建时长区间间隔:
# 定义一个时长区间,3秒到1天
time_deltas = pd.Interval(pd.Timedelta('3 seconds'),
pd.Timedelta('1 days'),
closed='both')
# 5分钟是否在时间区间里
pd.Timedelta('5 minutes') in time_deltas
# True
# 时长区间长度
time_deltas.length
# Timedelta('0 days 23:59:57')
pd.Interval 支持以下属性:
# 区间闭合之处
iv.closed # 'right'
# 检查间隔是否在左侧关闭
iv.closed_left # False
# 检查间隔是否在右侧关闭
iv.closed_right # True
# 间隔是否为空,表示该间隔不包含任何点
iv.is_empty # False
# 间隔的左边界
iv.left # 0
# 间隔的右边界
iv.right # 5
# 间隔的长度
iv.length # 5
# 间隔的中点
iv.mid # 2.5
# 间隔是否在左侧为开区间
iv.open_left # True
# 间隔是否在为开区间
iv.open_right # False
其中,Interval.is_empty 指示间隔是否为空,表示该间隔不包含任何点。
# 包含点的间隔不为空
pd.Interval(0, 1, closed='right').is_empty # False
# 不包含任何点的间隔为空
pd.Interval(0, 0, closed='right').is_empty # True
pd.Interval(0, 0, closed='left').is_empty # True
pd.Interval(0, 0, closed='neither').is_empty # True
# 包含单个点的间隔不为空
pd.Interval(0, 0, closed='both').is_empty # False
# 一个IntervalArray 或 IntervalIndex 返回一个布尔 ndarray
# 它在位置上指示 Interval 是否为空
ivs = [pd.Interval(0, 0, closed='neither'),
pd.Interval(1, 2, closed='neither')]
pd.arrays.IntervalArray(ivs).is_empty
# array([True, False])
# 缺失的值不认为是空的
ivs = [pd.Interval(0, 0, closed='neither'), np.nan]
pd.IntervalIndex(ivs).is_empty
# array([ True, False])
pd.Interval.overlaps 检查两个Interval对象是否重叠,如果两个间隔共享一个公共点,则两个间隔会重叠,包括封闭的端点。 只有共同的开放端点的间隔不会重叠。
i1 = pd.Interval(0, 2)
i2 = pd.Interval(1, 3)
i1.overlaps(i2) # True
i3 = pd.Interval(4, 5)
i1.overlaps(i3) # False
共享封闭端点的间隔重叠:
i4 = pd.Interval(0, 1, closed='both')
i5 = pd.Interval(1, 2, closed='both')
i4.overlaps(i5) # True
只有共同的开放端点的间隔不会重叠:
i6 = pd.Interval(1, 2, closed='neither')
i4.overlaps(i6) # False
在间隔上使用 +
和 *
进行操作,并且该操作将应用于其每个范围,因此结果取决于绑定元素的类型:
iv
# Interval(0, 5, closed='right')
shifted_iv = iv + 3
shifted_iv
# Interval(3, 8, closed='right')
extended_iv = iv * 10.0
extended_iv
# Interval(0.0, 50.0, closed='right')
Pandas 官方还未支持,参见讨论。
推荐使用 portion
(pip install portion
)库来解决,portion 库(以前以python-intervals的形式分发)提供间隔的数据结构和操作。
import portion as P
# 交集
P.closed(0, 2).intersection(P.closed(1, 3))
P.closed(0, 2) & P.closed(1, 3)
# [1,2]
# 并集
P.closed(0, 2).union(P.closed(1, 3))
P.closed(0, 2) | P.closed(1, 3)
# [0,3]
# 补集
P.closed(0, 2).complement()
# (-inf,0) | (2,+inf)
~P.closed(0, 1)
# (-inf,0) | (1,+inf)
~(P.open(-P.inf, 0) | P.open(1, P.inf))
# [0,1]
~P.open(-P.inf, P.inf)
# ()
# 差集
P.closed(0,2).difference(P.closed(1,2))
P.closed(0,2) - P.closed(1,2)
# [0,1)
P.closed(0, 4) - P.closed(1, 2)
# [0,1) | (2,4]
更多参考本站portion 间隔数据操作教程。
更新时间:2020-12-15 17:04:47 标签:pandas 区间