下面是日期格式的示例:
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')
在这里,打印出来的月份位于各自季度的末尾。您决定使用什么。