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

时间:2018-12-29 14:31:44

标签: python pandas datetime

以下是日期格式的示例:

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')

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

1 个答案:

答案 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')

在这里,打印出的月份分别位于相应季度的末尾。您决定使用什么。