在pandas / python中转换下面的逻辑时遇到很多麻烦,所以我什至没有示例代码或df可以与:x
一起使用。我运行了一份每日报告,该报告实际上过滤了从星期一到“今天”的前一天的数据。我有一个Date列[dt.strftime('%#m /%#d /%Y')格式]。永远不会超过周一至周日的范围。
1)在运行报表时识别“今天”这一天,并识别星期一之前的壁橱是哪一天。过滤今天日期之前星期一的“日期”列[dt.strftime('%#m /%#d /%Y')格式]
2)一旦为此过滤了df,请使用上面逻辑中具有日期的这组行,让它在新列“ Date2”中检查日期。如果有任何日期在星期一日期之前,请在Date2中,将“ Date2”中所有这些较早的日期更改为“日期”列中的星期一日期。
3)如果“今天”是星期一,则在“日期”列中从“先前星期一”到“星期日”过滤范围。对此进行过滤后,请执行上述步骤[步骤2],但是对于“ Date2”列中的任何日期,如星期六和星期日,都应将其更改为星期五。
这有意义吗?
答案 0 :(得分:0)
以下是步骤:
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')
# if today is Monday, we need to step back another week
if day_of_week == 0:
last_monday -= pd.to_timedelta(7, unit='d')
# filter for last Monday
last_monday_flags = (df.Date == last_mon)
# filter for Date2 < last Monday
date2_flags = (df.Date2 < last_monday)
# update where both flags are true
flags = last_monday_flags & date2_flags
df.loc[flags, 'Date2'] = last_monday
# if today is Monday
if day_of_week == 0:
last_sunday = last_monday + pd.to_timedelta(6, unit='d')
last_sat = last_sunday - pd.to_timedelta(1, unit='d')
last_week_flags = (df.Date >= last_monday) & (df.Date <= next_sunday)
last_sat_flags = (df.Date2 == last_sat)
last_sun_flags = (df.Date2 == last_sun)
# I'm just too lazy and not sure how Sat and Sun relates to Fri
# but i guess just subtract 1 day or 2 depending on which day
...