看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例是筛选连续日期的问题,在一列日期数据中,部分相邻数据是连续的,需要我们筛选出来。与数字连续的判断不同,日期的连续要判断它们的间隔是一天。
我们的数据如下:
import pandas as pd
from io import StringIO
data = '''
a
2022/9/23
2022/10/24
2022/9/21
2022/9/22
2022/9/23
2022/9/25
2022/9/26
2022/9/26
2022/11/2
2022/11/3
'''
df = pd.read_csv(StringIO(data))
df
# ...
将连续的日期筛选出来,比如:
'''
2022/9/21
2022/9/22
2022/9/23
'''
这部分是连续的。
要筛选连续日期的数据,我们要分析连续日期数据的特点。如果几个日期连续,那么它们其中一个日期与下一个日期的时间差为一天(最后一个日期除外),任意一个日期与上一个日期的时间差也为一天(第一个日期除外),第一个和最后一个日期是特殊情况,那么,我们将这两种数据取都考虑进去就能解决我们的问题。
先将数据转为时间类型:
df.astype('datetime64[ns]')
# ...
接着我们按思路增加两个辅助列,用于判断是否与上一个日期和下一个日期相差一天:
(
df.astype('datetime64[ns]')
.assign(b1=lambda d: d.a.diff().abs() == pd.Timedelta('1days'))
.assign(b2=lambda d: d.a.diff(-1).abs() == pd.Timedelta('1days') )
)
'''
a b1 b2
0 2022-09-23 False False
1 2022-10-24 False False
2 2022-09-21 False True
3 2022-09-22 True True
4 2022-09-23 True False
5 2022-09-25 False True
6 2022-09-26 True False
7 2022-09-26 False False
8 2022-11-02 False True
9 2022-11-03 True False
'''
其中时差要取绝对值,因为与上一个时间相差是负值。我们观察发现,如果一个日期与上下都不连续,b1 和 b2 值全是 False,所以我们筛选其中一个是 True 的。最终代码为:
day_1 = pd.Timedelta('1days') # 定义一个时差:一天
df = df.astype('datetime64[ns]') # 将数据转为时间类型
df[(df.a.diff().abs() == day_1) | (df.a.diff(-1).abs() == day_1)]
'''
a
2 2022-09-21
3 2022-09-22
4 2022-09-23
5 2022-09-25
6 2022-09-26
8 2022-11-02
9 2022-11-03
'''
得到的结果数据符合需求,这样我们就解决了这个问题。
(完)
更新时间:2024-08-18 16:07:47 标签:pandas python 日期 连续