Python Pandas - 构建日期基于其他列中的日期

Python Pandas - Build date based on date from other columns

我正在尝试根据数据框中不同列的日期构建一列日期。归结为我公司的财务日历在每个月的 22 日重置。如果我的源列中的日期早于该月的 22 日,那么我的日期需要是 22 日。如果是22号之后,则需要在下个月的22号。

我编写了一些代码,但无法使其正常运行,出现错误 Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我想将旧日期分成单独的列,处理每一列,然后将它们重新加入一个日期并删除我用来处理的所有列。

这里是当前代码的方向:

 df_connection['Year_OLD'] = df_connection['Date Created'].dt.year
 df_connection['Mon_OLD'] = df_connection['Date Created'].dt.month
 df_connection['Day_OLD'] = df_connection['Date Created'].dt.day

 def func_Year(y, m, d):
    if (m == 12) & (d >= 22):
        return y + 1
    else:
        return y

def func_Mon(y, m, d):
    if (m < 12) & (d >=22):
        return m + 1
    elif (m == 12) & (d >= 22):
       return 1
    else:
        return m

df_connection['Year'] = func_Year(df_connection['Year_OLD'], df_connection['Mon_OLD'], df_connection['Day_OLD'])

在您的代码中,您将数据帧直接传递给不正确的函数

You can pass values one by one by using lamda function

df_connection['Year_OLD'] = df_connection['Date Created'].dt.year
df_connection['Mon_OLD'] = df_connection['Date Created'].dt.month
df_connection['Day_OLD'] = df_connection['Date Created'].dt.day

def func_Year(y, m, d):
    if (m == 12) & (d >= 22):
        return y + 1
    else:
        return y

def func_Mon(y, m, d):
    if (m < 12) & (d >=22):
        return m + 1
    elif (m == 12) & (d >= 22):
       return 1
    else:
        return m

df_connection['Year'] = df_connection.apply(lambda x: func_Year(x['Year_OLD'], x['Mon_OLD'], x['Day_OLD']))

IIUC,可以用mask to check if a specific day is greater or equal 22. If so, use DateOffset加1个月。然后将所有天数替换为 22.

# create example data
daterange = pd.DataFrame(pd.date_range('2022-01-01', '2022-12-31'), columns=['Date Created']

daterange['Date Created'].mask(
    daterange['Date Created'].dt.day >= 22,
    daterange['Date Created'] + pd.DateOffset(months=1)
).apply(lambda x: x.replace(day=22))