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))
我正在尝试根据数据框中不同列的日期构建一列日期。归结为我公司的财务日历在每个月的 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))