看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求为给出一个日期,得到这个日期所在月份的最后一个星期三是哪天。我们先分析一下需求,整理一下思路。这个问题首先要用到 Pandas 时序相关的操作,给出一个日期后我们需要得到这个月的所有日期,然后再得到每个日期是星期几,筛选出星期三的日期,找到最后一个即可。我们开始编写代码,先指定一个日期,接着用时间的 replace 方法将日期定位到这个月的 1 日,方便后边使用时间偏移:
import pandas as pd
t = pd.Timestamp('2020-11-11') # t: Timestamp('2020-11-11 00:00:00')
t = t.replace(day=1) # t: Timestamp('2020-11-01 00:00:00')
用 pd.date_range() 构造出这个月的所有日期,结束时间取这个月的月底:
index = pd.date_range(start=t,
end=(t + pd.offsets.MonthEnd())
)
index
'''
DatetimeIndex(['2020-11-01', '2020-11-02', '2020-11-03', '2020-11-04',
'2020-11-05', '2020-11-06', '2020-11-07', '2020-11-08',
'2020-11-09', '2020-11-10', '2020-11-11', '2020-11-12',
'2020-11-13', '2020-11-14', '2020-11-15', '2020-11-16',
'2020-11-17', '2020-11-18', '2020-11-19', '2020-11-20',
'2020-11-21', '2020-11-22', '2020-11-23', '2020-11-24',
'2020-11-25', '2020-11-26', '2020-11-27', '2020-11-28',
'2020-11-29', '2020-11-30'],
dtype='datetime64[ns]', freq='D')
'''
将所有日期作为索引,增加一个日期对应星期几的列,由于星期一对应 0,为了方便识别,对星期加 1,这样星期一就对应 1:
(
pd.DataFrame(index.weekday+1, index=index.date, columns=['weekday'])
.head(10)
)
'''
weekday
2020-11-01 7
2020-11-02 1
2020-11-03 2
2020-11-04 3
2020-11-05 4
2020-11-06 5
2020-11-07 6
2020-11-08 7
2020-11-09 1
2020-11-10 2
'''
接着筛选出星期为 3 的所有日期,再取最后一个值,便得到最终结果:
(
pd.DataFrame(index.weekday+1, index=index.date, columns=['weekday'])
.query('weekday==3')
.tail(1)
.index[0]
)
# 2020-11-25
经过验证,2020 年 11 月 25 日是 2020 年 11 月的最后一个星期三,我们实现了上述的需求。接下来大家可以试着将上述的实现方法封装成一个函数,如果不传日期,日期就是今天,取今天可以用 pd.Timestamp('now') 来实现。
(完)
注:此案例收录在《深入浅出Pandas:利用Python进行数据处理与分析》17.2.2 小节。
更新时间:2024-08-18 16:12:16 标签:pandas 时间