我有一个形状的数据框(96,3)。有一个列'日期',其值为Q1-93,Q2-93,Q3-93,Q4-93等,直到2016年。我想从Q1-93提取日期为1993-03-31。并应用相同的在整个栏目
包含列的数据框:
请在下面找到我尝试过的代码: 我已经用这种方式尝试了一年,不能多年迭代
df['Quarter'], df['Year'] = zip(*df['Date'].apply(lambda x: (x[:2], x[3:])))
y=1993
for n in range (0,4):
if df['Quarter'].loc[n]=='Q1':
df['Date'].iloc[n]='{}-03-31'.format(y)
elif df['Quarter'].loc[n]=='Q2':
df['Date'].iloc[n]='{}-06-30'.format(y)
elif df['Quarter'].iloc[n]=='Q3':
df['Date'].iloc[n]='{}-09-30'.format(y)
else:
df['Date'].iloc[n]='{}-12-31'.format(y)
df.head()
尝试过一年多的方法,但也没有提供相关的输出:
from dateutil.rrule import rrule, MONTHLY
from datetime import datetime
a = datetime(1993, 3, 31)
for dt in rrule(freq=MONTHLY, dtstart=a, count=96, interval=3):
print (dt)
答案 0 :(得分:1)
我这样做:
In [193]: df
Out[193]:
Date
0 Q1-93
1 Q2-93
2 Q3-93
3 Q4-93
4 Q1-01
5 Q1-10
6 Q2-16
In [194]: def f(s):
...: t = s.str.extract(r'(Q\d+)-(\d+)', expand=True)
...: t[1] = pd.to_numeric(t[1], errors='coerce')
...: t[1] += np.where(t[1] < 35, 2000, 1900)
...: return pd.PeriodIndex(t[1].astype(str)+t[0], freq='Q') \
...: .astype(np.datetime64) + \
...: pd.offsets.QuarterEnd()
...:
In [195]: df['new'] = f(df['Date'])
In [196]: df
Out[196]:
Date new
0 Q1-93 1993-03-31
1 Q2-93 1993-06-30
2 Q3-93 1993-09-30
3 Q4-93 1993-12-31
4 Q1-01 2001-03-31
5 Q1-10 2010-03-31
6 Q2-16 2016-06-30