由于熊猫中单个单元格中有多个字符串,导致日期时间转换错误

时间:2019-11-03 07:30:34

标签: python pandas

我有一个数据框df,其中存在一个Date字段,如下所示。我正在使用pd.read_excel()方法从excel中读取此内容。

    Company Code    Trxn_date                Company Name     Type
      20040       2019-05-11 00:00:00             ABC        Series A #<--the date is in `datetime` object only.
      20034       2019-04-26 00:00:00             XYZ        Series A
      20033       "5/15/2018\n23/4/2019"          PQR       "Series A  
                                                             Series B" # <-- In same row. 
      20040       2019-06-05 00:00:00             ABC        Series B
      20056        8/16/2019                      MNO        Series B

如您所见,对于20033Trxn_date中有两个条目,相隔\nType字段也是如此。因此,如果我应用pd.to_datetime(df['Trxn_date']),我会得到一个明显的错误TypeError: invalid string coercion to datetime。我不想使用coerce选项。

请注意,除了2003320056以外,所有日期都由熊猫自动转换为datetime对象。

我想获得df,如下所示。

    Company Code    Trxn_date         Company Name    Type
      20040       2019-05-11            ABC         Series A   
      20034       2019-04-26            XYZ         Series A
      20033       2019-04-23            PQR         Series B  #<--Only the last date string is picked up and converted to datetime. 
      20040       2019-06-05            ABC         Series B
      20056       2019-08-16            MNO         Series B #<--The date format is changed to `yyyy-mm-dd`. 

我无法获得实现上述目标的任何线索。对于20056,我可以使用pd.to_datetime(df['Trxn_date'],errors='coerce').apply(lambda x : x.strftime('%Y-%m-%d') if pd.notnull(x) else ' ')。此操作在Trxn_date的{​​{1}}字段中创建一个空白。

有人可以对此提供任何见解吗?可能我必须编写一个函数,然后使用20033来实现相同功能?

1 个答案:

答案 0 :(得分:2)

您可以用\n拆分,并用str[-1]来获取最后一个列表,但是separator \n depends of real data, so should be different

df['Trxn_date'] = df['Trxn_date'].str.split('\n').str[-1]
df['Type'] = df['Type'].str.split('\n').str[-1]

df['Trxn_date'] = pd.to_datetime(df['Trxn_date'],errors='coerce').dt.strftime('%Y-%m-%d')