如何将日期格式字符串转换为bool True,将其他格式转换为False?

时间:2019-03-28 11:51:27

标签: python pandas

import pandas
import numpy
df=pandas.DataFrame({'col1':['a','b','c','b'],'col2':['N','2018-03-12 15:35',numpy.NaN,'2017-06-12 15:35'],'col3':['c','b','b','b']})
print(df)

以上脚本的输出为:

  col1              col2 col3
0    a                 N    c
1    b  2018-03-12 15:35    b
2    c               NaN    b
3    b  2017-06-12 15:35    b

对于列col2,我想将所有yyyy-mm-dd hh:mm格式的字符串转换为bool True,将其他字符串转换为False,并保持Na的值不变。
预期结果如下:

  col1              col2 col3
0    a             False    c
1    b              True    b
2    c               NaN    b
3    b              True    b

该怎么做? 预先感谢!

2 个答案:

答案 0 :(得分:3)

创建2个遮罩-首先用errors='coerce'转换to_datetime s并测试Series.notna,还测试此列:

m1 = pd.to_datetime(df['col2'], errors='coerce').notna()
m2 = df['col2'].notna()

然后将其传递给numpy.select-但有必要将NaN转换为None

df['col2'] = np.select([m1, m2], [True, False], None)
print(df)
0    a  False    c
1    b   True    b
2    c   None    b
3    b   True    b

或使用DataFrame.loc

df.loc[m2, 'col2'] = m1
print(df)
  col1   col2 col3
0    a  False    c
1    b   True    b
2    c    NaN    b
3    b   True    b

答案 1 :(得分:1)

您可以使用类似的内容:

m=df.col2.notna()
df.loc[m,'col2']=(pd.to_datetime(df.col2.dropna(),errors='coerce').isna()
                                            .map({True:False,False:True}))
    print(df)
  col1   col2 col3
0    a  False    c
1    b   True    b
2    c    NaN    b
3    b   True    b