看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在时间序列数据中,筛选相隔一天的数据可以用于分析连续两天之间的变化情况,例如股票价格的日涨跌幅、气温的日变化等。我们看看 pandas 如何筛选出这些数据。
数据如下,a 列为日期, b 列为数值:
import pandas as pd
from io import StringIO
data = '''
a b
2022/9/23 23
2022/10/24 21
2022/9/21 53
2022/9/22 43
2022/9/23 32
2022/9/25 23
2022/9/26 42
2022/11/3 86
'''
df = pd.read_csv(StringIO(data), sep=r'\s+')
df
# ...
需求需要对以上数据进行筛选,将相邻日期的数据筛选出来。
定义一个时长为一天的时长对象,然后判断当前行的上下行差值是否为一天,满足其中之一即满足需求。
先将时间列类型修改为时间类型:
df = df.astype({'a': 'datetime64[ns]'}) # 将数据转为时间类型
df
# ...
定义一个时差对象:
day_1 = pd.Timedelta('1days') # 定义一个时差:一天
day_1
# Timedelta('1 days 00:00:00')
接下来可以用这个时度为一天时差对象与其他数据进行对比了。
df[(df.a.diff().abs() == day_1) | (df.a.diff(-1).abs() == day_1)]
'''
a b
2 2022-09-21 53
3 2022-09-22 43
4 2022-09-23 32
5 2022-09-25 23
6 2022-09-26 42
'''
首先,通过 pd.Timedelta('1days')
创建了一个时间间隔对象 day_1,表示一天的时间间隔。
df.a.diff()
表示对 DataFrame df 的列 a 进行差分操作,计算相邻元素之间的差值。
df.a.diff().abs() == day_1
表示对差分结果取绝对值,并与时间间隔对象 day_1 进行比较,得到一个布尔类型的 Series 对象。该 Series 对象中,为 True 的元素表示与相邻元素的差值的绝对值等于一天。
df.a.diff(-1)
表示对 DataFrame df 的列 a 进行向后差分操作,计算当前元素与下一个元素之间的差值。
df.a.diff(-1).abs() == day_1
表示对向后差分结果取绝对值,并与时间间隔对象 day_1 进行比较,得到一个布尔类型的 Series 对象。该 Series 对象中,为 True 的元素表示与下一个元素的差值的绝对值等于一天。
通过使用逻辑运算符 |(或),将上述两个条件合并,生成一个新的布尔类型的 Series 对象,其中为 True 的元素表示满足任一条件的行。
df[(df.a.diff().abs() == day_1) | (df.a.diff(-1).abs() == day_1)]
通过将上述布尔类型的 Series 对象作为索引,从 DataFrame df 中选取满足条件的行。
因此,该代码的逻辑是选取 DataFrame df 中满足以下条件之一的行:要么与相邻元素的差值的绝对值为一天,要么与下一个元素的差值的绝对值为一天。这样可以找出在列 a 中,与前后元素之间间隔为一天的行。
这样就完成了需求。
(完)
更新时间:2024-08-18 16:17:04 标签:pandas python 连续 时长