在python pandas中创建新的日期列

时间:2019-03-13 15:05:18

标签: python pandas date

我正在尝试根据数据框中现有的日期列创建一个新的日期列。我想把第一列中的所有日期都设为第二列中的月初,所以:

03/15/2019 = 03/01/2019

我知道我可以使用:

df['newcolumn'] = pd.to_datetime(df['oldcolumn'], format='%Y-%m-%d').apply(lambda dt: dt.replace(day=1)).dt.date

我的问题是旧列中的某些数据无效日期。在某些行中有一些文本数据。因此,我试图弄清楚在执行此操作之前如何清理数据:

如果oldcolumn不是日期,则将其设为1990年1月1日,否则oldcolumn

或者,是否可以使用try / except来做到这一点?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

首先,我们生成一些样本数据:

df = pd.DataFrame([['2019-01-03'], ['asdf'], ['2019-11-10']], columns=['Date'])

可以安全地将其转换为datetime

df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
mask = df['Date'].isnull()
df.loc[mask, 'Date'] = dt.datetime(1990, 1, 1)

现在您不需要缓慢的apply

df['New'] = df['Date'] + pd.offsets.MonthBegin(-1)

答案 1 :(得分:0)

尝试使用参数errors=coerce。 这将返回NaT作为文本值。

df['newcolumn'] = pd.to_datetime(df['oldcolumn'], 
                                 format='%Y-%m-%d', 
                                 errors='coerce').apply(lambda dt: dt.replace(day=1)).dt.date

例如

# We have this dataframe
    ID        Date
0  111  03/15/2019
1  133  01/01/2019
2  948       Empty
3  452  02/10/2019

# We convert Date column to datetime
df['Date'] = pd.to_datetime(df.Date, format='%m/%d/%Y', errors='coerce')

输出

    ID       Date
0  111 2019-03-15
1  133 2019-01-01
2  948        NaT
3  452 2019-02-10