我有apandas数据框,其中有一个名为“ date”的列,其格式为YYQQ,例如1702。
该列是一个时间序列。但是,有一些遗漏的观察结果。例如,下面的数据框在日期1702被破坏。我有多个这样的数据框,每个数据框在不同的日期被破坏。我只想知道中断后的日期。在下面的示例中,我只想要1702年及以后的行。是否有一种简单而有效的方法?
date
1301
1302
1303
1304
1401
1702
1703
1704
1801
1802
您的问题有点模棱两可-我不确定为什么1702特别会算作中断,因此我假设您已经从其他地方知道该日期。在这种情况下,您可以尝试以下操作:
sub_df = my_df[my_df.date >= 1702]
。
这将创建一个新的数据框对象,该对象仅由指示1702年或之后年份的行组成。
首先,让我们重新创建您的数据框并创建新列,以分别表示每个日期的年(YY
)和四分之一(QQ
):
import pandas as pd
df = pd.DataFrame({'date': [1301,1302,1303,1304,1401,1702,1703,1704,1801,1802]})
df[['YY','QQ']] = df['date'].astype(str).str.extract(r'(\d{2})(\d{2})')
现在我们有:
date YY QQ
0 1301 13 01
1 1302 13 02
2 1303 13 03
3 1304 13 04
4 1401 14 01
5 1702 17 02
6 1703 17 03
7 1704 17 04
8 1801 18 01
9 1802 18 02
让我们将每个季度转换为该季度中的一个月,然后我们可以转换回datetime
系列,并找到超过3个月的第一次时差。最后,我们可以根据满足此布尔掩码(即中断)的第一个索引对数据帧进行切片:
df['MM'] = df['QQ'].astype(int)*3
df['date_t'] = pd.to_datetime(df['YY'].astype(str)+df['MM'].astype(str), format='%y%m')
df.iloc[df[df['date_t'].diff().astype('timedelta64[M]')>3].index[0]:]
收益率:
date YY QQ MM date_t
5 1702 17 02 6 2017-06-01
6 1703 17 03 9 2017-09-01
7 1704 17 04 12 2017-12-01
8 1801 18 01 3 2018-03-01
9 1802 18 02 6 2018-06-01