繁体   English   中英

对熊猫数据框中的日期列进行条件更新

[英]Conditional update to a date column in pandas dataframe

对于给定的表:

df = pd.DataFrame(  {
'datetime': ['2015-01-01', '2015-04-01', '2015-07-01', '2015-12-01', '2015-01-01', '2015-04-01', '2015-07-01', '2015-12-01'],
})
df['datetime'] = pd.to_datetime(df['datetime'])

我想将所有周末的日期(所以工作日==5或工作日==6)更改为前周五,所以是这样的:

def adjust_exp_date(x):
    if x.weekday()==5:
        x.weekday() -= 1
    if x.weekday()==6:
        x.weekday() -= 2

df['datetime'].apply(adjust_exp_date)

我能够结合使用为日期分配一天并根据日期时间列使用 np.select() 来 timedelta 7 天

df = pd.DataFrame(  {
'datetime': ['2015-01-01', '2015-01-02', '2015-04-01', '2015-07-01', '2015-12-01', '2015-01-01', '2015-04-01', '2015-07-01', '2015-12-01'],
})
df['datetime'] = pd.to_datetime(df['datetime'])
df['dayOfWeek'] = df['datetime'].dt.day_name()
condition_list = [df['dayOfWeek'] == 'Friday', df['dayOfWeek'] == 'Saturday']
choice_list = [df['datetime'] - datetime.timedelta(days=7), df['datetime'] - datetime.timedelta(days=8)]
df['datetime'] = np.select(condition_list, choice_list, df['datetime'])
df

此外,我添加了一个日期('2015-01-02'),因为您的原始示例不包括任何星期五日期

您可以子pd.offsets.Week以调整到最近的星期五(工作日 4)

m = df['datetime'].dt.weekday.isin([5,6])

df['adjust'] = df['datetime'].mask(m, df['datetime'] - pd.offsets.Week(weekday=4))
     datetime       week  weekday     adjust  adjustweek
0  2015-01-01   Thursday        3 2015-01-01   Thursday
1  2015-01-02     Friday        4 2015-01-02     Friday
2  2015-01-03   Saturday        5 2015-01-02     Friday
3  2015-01-04     Sunday        6 2015-01-02     Friday
4  2015-01-05     Monday        0 2015-01-05     Monday
5  2015-01-06    Tuesday        1 2015-01-06    Tuesday
6  2015-01-07  Wednesday        2 2015-01-07  Wednesday
7  2015-01-08   Thursday        3 2015-01-08   Thursday
8  2015-01-09     Friday        4 2015-01-09     Friday
9  2015-01-10   Saturday        5 2015-01-09     Friday
10 2015-01-11     Sunday        6 2015-01-09     Friday
11 2015-01-12     Monday        0 2015-01-12     Monday
12 2015-01-13    Tuesday        1 2015-01-13    Tuesday
13 2015-01-14  Wednesday        2 2015-01-14  Wednesday
14 2015-01-15   Thursday        3 2015-01-15   Thursday
15 2015-01-16     Friday        4 2015-01-16     Friday

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM