首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从数据集中选择特定日期,否则下一个工作日不可用

从数据集中选择特定日期,否则下一个工作日不可用
EN

Stack Overflow用户
提问于 2020-06-15 02:53:23
回答 3查看 54关注 0票数 0

我有一个跨越多年的大型数据集,我想通过使用python根据一个月中的某一天选择数据来对此数据框子集。

这很简单,我用下面这行代码实现了:

df[df.index.day == 12]

这将选择数据集中所有年份的每个月12号的数据。太棒了。

然而,我的问题是,原始数据集是基于工作日数据的。因此,12日实际上可能是周末或国庆节,因此不会出现在数据集中。因此,该月不会返回任何内容。

我希望发生的是在可用的情况下选择第12个工作日,否则选择数据集中的下一个工作日。

感谢大家的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-15 03:02:15

您可以先对数据帧执行backfill操作以填充缺少的值,然后选择您想要的df = df.asfreq('d', method='bfill')日期

然后就可以执行df[df.index.day == 12]

票数 0
EN

Stack Overflow用户

发布于 2020-06-15 03:06:35

这里有一个解决方案,从每个月的三天(12,13和14天)开始,然后选择最小的。如果12号是周末,它将不存在于原始数据帧中,而您将获得13号。14号也是如此。

代码如下:

代码语言:javascript
运行
复制
# Create dummy data - initial range
df = pd.DataFrame(pd.date_range("2018-01-01", "2020-06-01"), columns = ["date"])

# Create dummy data - Drop weekends 
df = df[df.date.dt.weekday.isin(range(5))]

# get only the 12, 13, and 14 of every month
# group by year and month. 
# get the minimum
df[df.date.dt.day.isin([12, 13, 14])].groupby(by=[df.date.dt.year, df.date.dt.month], as_index=False).min()

结果:

代码语言:javascript
运行
复制
         date
0  2018-01-12
1  2018-02-12
2  2018-03-12
3  2018-04-12
4  2018-05-14
5  2018-06-12
6  2018-07-12
7  2018-08-13
8  2018-09-12
9  2018-10-12
...

编辑

根据评论中关于国家节假日的一个问题:同样的解决方案也适用。而不是选择3天(12,13,14),选择一个更大的数字(例如12-18)。然后,获取数据帧中实际存在的最小值-这是从第12天开始的第一个工作日。

票数 1
EN

Stack Overflow用户

发布于 2020-06-15 03:25:37

这就是我的方法,我将解释代码下面的每一行。如果有什么不清楚的地方,请随时添加评论:

代码语言:javascript
运行
复制
!pip install workalendar #Install the module
import pandas as pd #Import pandas
from workalendar.usa import NewYork #Import the required country and city 
df = pd.DataFrame(pd.date_range(start='1/1/2018', end='12/31/2018')).rename(columns={0:'Dates'}) #Create a dataframe with dates for the year 2018
cal = NewYork() #Instance the calendar
df['Is_Working_Day'] = df['Dates'].map(lambda x: cal.is_working_day(x)) #Create an extra column, True for working days, False otherwise
df[(df['Dates'].dt.day >= 12) & (df['Is_Working_Day'] == True)].groupby(df['Dates'].dt.month)['Dates'].first()

本质上,这最后一行返回值等于或大于12的实际工作日的所有天,然后我们按月对它们进行分组,并返回每个满足此条件的第一天(day >= 12且Working_day = True)。

输出:

代码语言:javascript
运行
复制
Dates
1    2018-01-12
2    2018-02-13
3    2018-03-12
4    2018-04-12
5    2018-05-14
6    2018-06-12
7    2018-07-12
8    2018-08-13
9    2018-09-12
10   2018-10-12
11   2018-11-13
12   2018-12-12
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62376907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档