从熊猫数据框更快地从字符串中获取日期时间

时间:2019-08-25 23:14:05

标签: python pandas datetime optimization

从数据中提取日,月,年,小时,工作日,day_month_year,然后放入列中

数据列:

+----------------------+
|         Date         |
+----------------------+
| '11/28/17  00:36 '   |
| '11/28/17  01:15 AM' |
| 'abc'                |
| 11/28/17  01:28 '    |
| 'pqr'                |
+----------------------+

目标:

+-----+-------+------+---------+------+-----------------+
| Day | Month | Year | Weekday | Hour | Day_month_year  |
+-----+-------+------+---------+------+-----------------+
| 28  | Nov   | 2017 | Tue     | 00   | 2017-11-28      |
| 28  | Nov   | 2017 | Tue     | 01   | 2017-11-28      |
| Nan | Nan   | Nan  | Nan     | Nan  | Nan             |
| 28  | Nov   | 2017 | Tue     | 01   | 2017-11-28      |
| Nan | Nan   | Nan  | Nan     | Nan  | Nan             |
+-----+-------+------+---------+------+-----------------+

代码:

df['datetime'] = pd.to_datetime(df['Date'],infer_datetime_format=True,errors='coerce')
df['Day'] = df['datetime'].dt.strftime('%d')
df['Month'] = df['datetime'].dt.strftime('%b')
df['Year'] = df['datetime'].dt.strftime('%Y')
df['WeekDay'] = df['datetime'].dt.strftime('%a')
df['Hour'] = df['datetime'].dt.strftime('%H')
df['Day_month_year'] = pd.to_datetime(df['datetime']).dt.to_period('D')

这些代码行需要很长时间,因为我的Date列没有特定的数据格式,并且有很少的值无法解析为datetime。我的“日期”列有近4万条记录,有没有一种更快的方法来执行此操作。

1 个答案:

答案 0 :(得分:1)

使用pd.to_datetime

s = pd.to_datetime(df['Date'], errors='coerce')
df['Day'] = s.dt.day
df['Month'] = s.dt.month
df['Year'] = s.dt.year
df['Weekday'] = s.dt.strftime('%a')
df['Hour'] = s.dt.hour
df['Day_Month_Year'] = s.dt.date

输出:

                 Date   Day  Month    Year Weekday  Hour Day_Month_Year
0    11/28/17  00:36   28.0   11.0  2017.0     Tue   0.0     2017-11-28
1  11/28/17  01:15 AM  28.0   11.0  2017.0     Tue   1.0     2017-11-28
2                 abc   NaN    NaN     NaN     NaT   NaN            NaT
3    11/28/17  01:28   28.0   11.0  2017.0     Tue   1.0     2017-11-28
4                 pqr   NaN    NaN     NaN     NaT   NaN            NaT

列必须转换为浮点数,因为它们必须处理NaN。它们很容易转换为int