首页 > 解决方案 > 在一列中组合两种数据类型

问题描述

我正在将一个 Excel 文件读入 Python,其中有一列日期格式为字符串。一些单元格包含破折号而不是日期。目前我正在将破折号转换为空白,然后将该列格式化为日期时间列。但是,我想让带有破折号的单元格读取“打开”而不是空白。这可能吗?

df_Fin['Trade Term Date'] = np.where(df_Fin['Modified Term Date'] == '-', '', 
                                     df_Fin['Modified Term Date'])

df_Fin['Trade Term Date'] = [time.date() for time in df_Fin['Trade Term Date']]

标签: pythonnumpydataframe

解决方案


您不能将 'OPEN' 转换为日期,但可以将 lambda 函数映射到列表:

    from datetime import datetime as d.strptime
    
    #This tranforms x into a date if x has not the value 'OPEN'
    date_format = "%d.%m.%Y" #Change this to your format. d = day, m = month, y = year
    transform = lambda x: d.strptime(x, date_format) if x != 'OPEN' else x

    #This applies the Function to the complete list
    df['Trade Term Date'] = list(map(transform, df['Trade Term Date']))

我用这种值创建了一个小数据框:

       Trade Term Date
0  2020-03-12 00:00:00
1  2020-03-12 00:00:00
2  2020-03-12 00:00:00
3  2020-03-12 00:00:00
4  2020-03-12 00:00:00
5                 OPEN
6  2020-03-12 00:00:00
7                 OPEN

您可以在 lambda 表达式中应用您需要的任何函数。

但是一个小问题仍然存在。如果将某些数据转换为日期,则列的类型将不是日期,因此数据不会作为日期安全。这是由于 num-memory 过程,其中列中的每个元素都需要具有相同的数据类型,而“OPEN”不能具有日期类型。


推荐阅读