以下是日期格式的示例:
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
想要将Quarter列转换为Pandas日期时间格式,例如 “ 2001年1月”或“ 2001年1月1日”,可以在 fbProphet 中使用它进行时间序列分析。
尝试使用strptime,但出现错误TypeError: strptime() argument 1 must be str, not Series
from datetime import datetime
data['Quarter'] = datetime.strptime(data['Quarter'], 'Q%q_%y')
错误原因是什么?有更好的解决方案吗?
答案 0 :(得分:3)
知道格式to_datetime
需要通过周期索引是有帮助的(与YYYY-QX
相似),所以我们从replace
开始,然后从to_datetime
开始,最后strftime
:
u = df.Quarter.str.replace(r'(Q\d)_(\d+)', r'20\2-\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'(Q\d)_(\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年。
此hack将在几十年后停止工作。熊猫神,请怜悯我的灵魂:-)
另一个选项是解析为PeriodIndex
:
(pd.PeriodIndex(df.Quarter.str.replace(r'(Q\d)_(\d+)', r'20\2-\1'), freq='Q')
.strftime('%b-%Y'))
# Index(['Mar-2001', 'Jun-2001', 'Sep-2001',
# 'Dec-2001', 'Mar-2002', 'Jun-2002'], dtype='object')
在这里,打印出的月份分别位于相应季度的末尾。您决定使用什么。