在我的数据框中,我有一个包含日期的列。只有在格式为' YYYYMMDD'或者' MMDD'。此外,如果格式为“MMDD'”,则应从另一列获取年份并将其附加到MMDD日期中,如此;
df['YYYYMMDD'] = df['YYYY'].astype(str) + df['Date'].astype(str).apply(lambda x: x.zfill(4))
追加后,旧列将被删除,新列重命名为所需的输出。
对于比赛,我已经尝试了正则表达式(df_ori['Date'].str.matches(r'^\d{8}$')
),但我收到错误;
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
。
我尝试df_ori['Date'].astype(str).str.matches(r'^\d{8}$')
并提出错误;
'StringMethods' object has no attribute 'matches'
我认为我真的错误地采取了这种做法。任何帮助表示赞赏。
根据要求df.head():
YYYY MMDD
0 2016 525
1 2016 728
2 2014 821
3 2016 311
4 2016 422
答案 0 :(得分:1)
df['YYYYMMDD'] = df['YYYY'].astype(str) + df['Date'].astype(str).str.zfill(4)
print (df_ori['YYYYMMDD'].astype(str).str.match(r'^\d{8}$'))
0 True
1 True
2 True
3 True
4 True
Name: YYYYMMDD, dtype: bool
如果想要4
或8
匹配:
print (df_ori['YYYYMMDD'].astype(str).str.match(r'^\d{8}$|^\d{4}$'))
如果想从4到8匹配:
print (df_ori['YYYYMMDD'].astype(str).str.match(r'^\d{4,8}$'))
编辑:
如果len 4
只需要追加:
print (df_ori)
YYYY MMDD YYYYMMDD
0 2016 525 20160525
1 2016 728 20160728
2 2014 1121 1121
3 2016 1211 2211
4 2016 422 20160422
a = df_ori['YYYY'].astype(str) + df_ori['YYYYMMDD'].astype(str)
m = df_ori['YYYYMMDD'].astype(str).str.len() == 4
df_ori['YYYYMMDD'] = df_ori['YYYYMMDD'].mask(m, a)
print (df_ori)
YYYY MMDD YYYYMMDD
0 2016 525 20160525
1 2016 728 20160728
2 2014 1121 20141121
3 2016 1211 20162211
4 2016 422 20160422