在Python中创建两个从原始列派生的新列

在Python中创建两个从原始列派生的新列,python,pandas,numpy,Python,Pandas,Numpy,我有一个数据帧df,它包含两列,其中包含四分之一的值。我想再创建两个相当于“长日期”的列 数据 ID Quarter Delivery A Q1 2022 Q3 2022 A Q1 2022 Q3 2022 B Q1 2022 Q3 2022 B Q1 2022 Q3 2022 所需的 ID Quarter Delivery QuarterFull DeliveryFull A Q1 2022 Q3 2022 1/1/2022

我有一个数据帧df,它包含两列,其中包含四分之一的值。我想再创建两个相当于“长日期”的列

数据

ID  Quarter Delivery    
A   Q1 2022 Q3 2022 
A   Q1 2022 Q3 2022 
B   Q1 2022 Q3 2022 
B   Q1 2022 Q3 2022 
所需的

ID  Quarter Delivery    QuarterFull DeliveryFull    
A   Q1 2022 Q3 2022     1/1/2022    07/1/2022   
A   Q1 2022 Q3 2022     1/1/2022    07/1/2022   
B   Q4 2022 Q2 2023     10/1/2022   04/1/2023   
B   Q4 2022 Q2 2023     10/1/2022   04/1/2023   


Q1 is 01
Q2 is 04
Q3 is 07
Q4 is 10

我的方法/逻辑是创建保存或映射到特定日期的变量或字典 (键/值对)

不确定如何将其实现为列。我仍在对此进行故障排除。如有任何建议,我们将不胜感激

import pandas as pd

df = pd.DataFrame({'ID': ['A', 'B'], 'Quarter':['Q1 2020', 'Q2 2021']})

def convDate(date):
  q, year = date.split()
  q = int(q[1])
  return f'{q*3-2:02d}/1/{year}'

df['QuarterFull'] = df['Quarter'].map(convDate)
df.head()
输出

   ID   Quarter QuarterFull
0   A   Q1 2020 01/1/2020
1   B   Q2 2021 04/1/2021

使用字典
d
映射:

d = {"Q1": "01", "Q2": "04", "Q3": "07", "Q4": "10"}
>>> df["Quarter"].apply(lambda x: pd.to_datetime(f"{d[x[:2]]} {x[-4:]}", format="%m %Y"))
0   2022-01-01
1   2022-01-01
2   2022-10-01
3   2022-10-01
Name: Quarter, dtype: datetime64[ns]

通过这种方式,数据为日期时间格式。

无中间dict:

quarter_to_full_date = \
    lambda q: (pd.to_datetime(q.str.split().str[::-1].map("-".join)) \
    + pd.DateOffset(months=3)).dt.strftime("%m/%d/%Y")

df["QuarterFull"] = quarter_to_full_date(df["Quarter"]
df["DeliveryFull"] = quarter_to_full_date(df["Delivery"]
quarter_to_full_date = \
    lambda q: (pd.to_datetime(q.str.split().str[::-1].map("-".join)) \
    + pd.DateOffset(months=3)).dt.strftime("%m/%d/%Y")

df["QuarterFull"] = quarter_to_full_date(df["Quarter"]
df["DeliveryFull"] = quarter_to_full_date(df["Delivery"]
>>> df
  ID  Quarter Delivery QuarterFull
0  A  Q1 2022  Q3 2022  04/01/2022
1  A  Q1 2022  Q3 2022  04/01/2022
2  B  Q4 2022  Q2 2023  01/01/2023
3  B  Q4 2022  Q2 2023  01/01/2023