使用 pandas 将 Q1-Q4 周期字符串转换为日期时间



下面是日期格式的示例:

data = pd.DataFrame({'Quarter':['Q1_01','Q2_01', 'Q3_01', 'Q4_01', 'Q1_02','Q2_02']
                     , 'Sale' :[10, 20, 30, 40, 50, 60]})
print(data)
#   Quarter  Sale
#0  Q1_01    10
#1  Q2_01    20
#2  Q3_01    30
#3  Q4_01    40
#4  Q1_02    50
#5  Q2_02    60
print(data.dtypes)
# Quarter    object
# Sale        int64

想将季度列转换为熊猫日期时间格式,例如"Jan-2001"或"01-2001",可在 fbProphet 中进行时间序列分析。

尝试使用strptime,但TypeError: strptime() argument 1 must be str, not Series出现错误

from datetime import datetime
data['Quarter'] = datetime.strptime(data['Quarter'], 'Q%q_%y')

错误的原因是什么?有什么更好的解决方案吗?

了解to_datetime传递周期索引所需的格式很有帮助(它与 YYYY-QX 相同),所以我们从 replace 开始,然后to_datetime,最后strftime

u = df.Quarter.str.replace(r'(Qd)_(d+)', r'202-1')
pd.to_datetime(u).dt.strftime('%b-%Y')
0    Jan-2001
1    Apr-2001
2    Jul-2001
3    Oct-2001
4    Jan-2002
5    Apr-2002
Name: Quarter, dtype: object

该月代表其各自季度的开始。


如果日期可以在 90 年代和 2000 年代之间,那么让我们尝试一些不同的东西:

df = pd.DataFrame({'Quarter':['Q1_98','Q2_99', 'Q3_01', 'Q4_01', 'Q1_02','Q2_02']}) 
dt = pd.to_datetime(df.Quarter.str.replace(r'(Qd)_(d+)', r'2-1'))
(dt.where(dt <= pd.to_datetime('today'), dt - pd.DateOffset(years=100))
   .dt.strftime('%b-%Y'))
0    Jan-1998
1    Apr-1999
2    Jul-2001
3    Oct-2001
4    Jan-2002
5    Apr-2002
Name: Quarter, dtype: object

pd.to_datetime自动将"98"解析为"2098",因此我们做了一些修复,从晚于"今天的日期"的日期中减去 100 年。

这个黑客将在几十年内停止工作。你们熊猫神,怜悯我的灵魂:-)


另一种选择是解析为 PeriodIndex

(pd.PeriodIndex(df.Quarter.str.replace(r'(Qd)_(d+)', r'202-1'), freq='Q')
   .strftime('%b-%Y'))
# Index(['Mar-2001', 'Jun-2001', 'Sep-2001', 
#        'Dec-2001', 'Mar-2002', 'Jun-2002'], dtype='object')

在这里,打印出来的月份位于各自季度的末尾。您决定使用什么。

最新更新