我正在尝试根据数据框中现有的日期列创建一个新的日期列。我想把第一列中的所有日期都设为第二列中的月初,所以:
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来做到这一点?
任何帮助将不胜感激。
答案 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