根据条件更改pandas中的日期值并转换为datetime

时间:2017-12-02 23:48:38

标签: python pandas datetime dataframe

我有一个数据框,其列看起来像一个日期但实际上是一个对象(type 'O')。该列中的某些值的值为9999-12-31 00:00:00.000。从某种意义上说,它们是一个行“无限期”有效的指标。

pd.to_datetime()对这些值失败并给出“日期超出范围”错误。我试着编写一个将值转换为字符串的函数,然后检查第一个字符以查看它是否为9,但这也不起作用。

只是让你相信我尝试了一些东西,这些是我尝试过的两个功能:

def change_to_datetime(df, colname):
    for index, row in df.iterrows():
        string = str(row[12])
        if string[0] == '9':
            row[12] = '2018-01-01 00:00:00.000'
        row[12] = pd.to_datetime(row[12])
    return df

def change_to_datetime2(df, colname):
    mask = str(df.colname)[0] == '9'
    df.loc[mask, colname] = '2018-01-01 00:00:00.000'
    df[colname] = pd.to_datetime(df[colname])
    return df

我也在这里读过其他类似的问题,但他们没有帮助我。我是熊猫的新手。

2 个答案:

答案 0 :(得分:1)

您可以使用df.replace()并替换字符串'9999-12-31 00:00:00.000'吗?

df.replace(to_replace='9999-12-31 00:00:00.000', value='2018-01-01 00:00:00.000', inplace = True)

https://pandas.pydata.org/pandas-docs/version/0.21/generated/pandas.DataFrame.replace.html

答案 1 :(得分:1)

如果9999是唯一的问题,您可以使用errors='coerce'将无效输入转换为NaT空值。然后,您可以使用'2018-01-01 00:00:00.000'

填写这些内容

使用此选项并将其分配给您想要的任何列

filler = pd.to_datetime('2018-01-01')
pd.to_datetime(df[colname], errors='coerce').fillna(filler)