熊猫-识别熊猫列中的日期是在星期六还是星期日

时间:2019-05-30 01:05:58

标签: python pandas

我想确定日期值是在星期六还是星期日。如果是,那么我想将上述日期更改为星期五之前的日期。 (示例df和下面的结果df-这些是自2019年5月起的真实日期,如您所见,结果df的前一周有一个星期六(5/4/19)和星期日(5/26/19)日期。(5/2/19)日期与工作日保持一致,而不是周末。

import pandas as pd
data = [['5/3/19','5/4/19'],['5/3/19','5/2/19'],['5/24/19','5/26/19']]
df = pd.DataFrame(data,columns=['Date1','Date2'])
print(df)


data2 = [['5/3/19','5/3/19'],['5/3/19','5/2/19'],['5/24/19','5/24/19']]
resultsdf = pd.DataFrame(data2,columns=['Date1','Date2'])
print(resultsdf)

我正在将此代码运行一个月到日期范围。我必须具有将大型数据集分组到MTD视图中的代码-但我无法为星期六/星期日列表创建变量(因为每月会有8-10个周末日期),这是我的代码:< / p>

import pandas as pd
import xlrd # added when using visual studio 
import datetime
from datetime import datetime
today = pd.to_datetime(datetime.now().date())
day_of_week = today.dayofweek
last_monday = today - pd.to_timedelta(day_of_week, unit='d')
month_day = today.day
start_month_scope = today - pd.to_timedelta(month_day, unit = 'd')
first_day_of_month = start_month_scope + pd.to_timedelta(1, unit = 'd')

以下代码的问题在于,仅当我需要查找7天(MF)的星期六和星期日时,该方法才有效。

last_sunday = last_monday + pd.to_timedelta(6, unit='d')
last_sat = last_sunday - pd.to_timedelta(1, unit='d')
last_fri = last_sunday - pd.to_timedelta(2, unit='d')

我需要一些变量输入下面的代码:

finaldf.loc[(finaldf['Due_Date'] == last_sat), 'Due_Date'] = last_fri

因此,“ last_fri”将只是给定周六或周日的最新星期五,因此,以我的示例df为例,有一个5/4/19示例,该示例被拉回到5/3/19(最后一个星期五) (对于该实例)或5/26/19被拉回到5/24/19。如您所见,如果日期是周六和周日,则代码必须首先理解,然后是下一个最接近的星期五。

*如果以上所有内容都令人困惑,请只引用我的df-> resulftdf *

3 个答案:

答案 0 :(得分:1)

在您的情况下,将BDaynp.where一起使用

df=df.apply(pd.to_datetime)
from pandas.tseries.offsets import BDay
for x in df.columns:
    df[x]=np.where(df[x].dt.weekday.isin([5,6]),df[x]-BDay(1),df[x])

df
Out[623]: 
       Date1      Date2
0 2019-05-03 2019-05-03
1 2019-05-03 2019-05-02
2 2019-05-24 2019-05-24

答案 1 :(得分:1)

我认为类似的事情也是可能的:

finaldf['Due_Date'] = [x + pd.to_timedelta(4 - x.dayofweek, unit='d') if x.dayofweek > 4 else x for x in findaldf.Due_Date]

答案 2 :(得分:1)

这里是一个班轮:

df.Date1 -= pd.to_timedelta(
    (df.Date1.dt.dayofweek - 4).apply(lambda v: v if v > 0 else 0), unit="D"
)