看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在一个长时间的时序数据中,Pandas 如何查询筛选中每个月一日的数据呢,本文将介绍如何实现。
我们先看一下我们构建的数据集:
import pandas as pd
index = pd.date_range('2021-01-01', periods=180, freq='D')
s = pd.Series(range(len(index)), index=index)
s
'''
2021-01-01 0
2021-01-02 1
2021-01-03 2
2021-01-04 3
2021-01-05 4
...
2021-06-25 175
2021-06-26 176
2021-06-27 177
2021-06-28 178
2021-06-29 179
Freq: D, Length: 180, dtype: int64
'''
我们构造了半年的数据,接下来要查询出每月1号的数据。
上边的数据集是一个 Series,我们知道 Series 也支持切片查询,我们将时间索引做逻辑判断,看其的日期的日部分是否等于 1,返回布尔序列后再放入切片查询逻辑中,就能得到结果。
先做日期中日是否为1的逻辑判断:
# 取时间索引中的日的值
s.index.day
'''
Int64Index([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
...
20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
dtype='int64', length=180)
'''
# 对比是否为1
s.index.day == 1
'''
array([ True, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
......
False, False, False, False, False, False, False, False, False])
'''
最后将判断放入切片查询中:
s[s.index.day == 1]
'''
2021-01-01 0
2021-02-01 31
2021-03-01 59
2021-04-01 90
2021-05-01 120
2021-06-01 151
dtype: int64
'''
这样就最终得到了查询结果。另外,如果时间序列不在索引上,而是在普通列上,可以使用 .dt.<xxx>
访问器来做日期的读取:
import pandas as pd
index = pd.date_range('2021-01-01', periods=180, freq='D')
df = pd.DataFrame({'date': index, 'col': range(len(index))})
df.head()
'''
date col
0 2021-01-01 0
1 2021-01-02 1
2 2021-01-03 2
3 2021-01-04 3
4 2021-01-05 4
'''
# 用 dt 时间访问器
df[df.date.dt.day==1]
'''
date col
0 2021-01-01 0
31 2021-02-01 31
59 2021-03-01 59
90 2021-04-01 90
120 2021-05-01 120
151 2021-06-01 151
'''
(完)
更新时间:2024-08-18 15:37:11 标签:pandas python 时间