在Python中创建两个从原始列派生的新列
我有一个数据帧df,它包含两列,其中包含四分之一的值。我想再创建两个相当于“长日期”的列 数据在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
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