首页 > 解决方案 > 如何使用字典将开始和结束日期转换为一段时间,例如 jan-dec 是日历年

问题描述

我有一个数据框,其中包含一段时间的开始日期和结束日期,yyyy-mm并且我想要一个具有该时间段的新列 - 例如,开始日期2019-01和结束日期2019-12Cal-19在新列中,想要拥有这个多年和几个季度,然后如果它不是其中任何mm-yyyy - mm-yyyy一个,作为开始到结束日期的字符串。

我曾尝试使用具有两个输入(开始日期和结束日期)的字典来执行此操作,并且会有该期间的输出,但这没有奏效。

from Dictionary import Period

df["Start Period"]=pd.to_datetime(df["Start Date"], dayfirst=True).dt.to_period("M")

df["End Period"]=pd.to_datetime(df["End Date"], dayfirst=True).dt.to_period("M")

df["Period"] = df["Start Period"].map(Period) #This is the line which isn't working

其中 Period 是一个字典,如下所示:

Period = dict({("2019-01","2019-12"):"Cal-19",
            ("2020-01","2020-12"):"Cal-20",
            ("2021-01","2021-12"):"Cal-21",
            ("2019-01","2019-03"):"Q1-19",
            ("2019-04","2019-06"):"Q2-19",
            ("2019-07","2019-09"):"Q3-19",
            ("2019-10","2019-12"):"Q4-19",
            ("2020-01","2020-03"):"Q1-20",
            ("2020-04","2020-06"):"Q2-20",
            ("2020-07","2020-09"):"Q3-20"}) 

预计会得到句点,但会在字典本身中出现错误,但即使在尝试我NaN在输出列中得到的一小部分数据时也是如此。

标签: pythonpandas

解决方案


您需要通过列表理解对所有带有 dict 值的句点组合进行展平字典period_range

Period = dict({("2019-01","2019-12"):"Cal-19",
            ("2020-01","2020-12"):"Cal-20",
            ("2021-01","2021-12"):"Cal-21",
            ("2019-01","2019-03"):"Q1-19",
            ("2019-04","2019-06"):"Q2-19",
            ("2019-07","2019-09"):"Q3-19",
            ("2019-10","2019-12"):"Q4-19",
            ("2020-01","2020-03"):"Q1-20",
            ("2020-04","2020-06"):"Q2-20",
            ("2020-07","2020-09"):"Q3-20"}) 

d = {x:v for (k1,k2), v in Period.items() for x in pd.period_range(k1, k2, freq='M')}

df = pd.DataFrame({'Start Period': pd.period_range('2019-01', '2020-09', freq='M')})

#map by dictioanry d
df["Period"] = df["Start Period"].map(d)
print (df)
   Start Period Period
0       2019-01  Q1-19
1       2019-02  Q1-19
2       2019-03  Q1-19
3       2019-04  Q2-19
4       2019-05  Q2-19
5       2019-06  Q2-19
6       2019-07  Q3-19
7       2019-08  Q3-19
8       2019-09  Q3-19
9       2019-10  Q4-19
10      2019-11  Q4-19
11      2019-12  Q4-19
12      2020-01  Q1-20
13      2020-02  Q1-20
14      2020-03  Q1-20
15      2020-04  Q2-20
16      2020-05  Q2-20
17      2020-06  Q2-20
18      2020-07  Q3-20
19      2020-08  Q3-20
20      2020-09  Q3-20

推荐阅读