首页 > 解决方案 > 如何将 DF 中的字段解析为月、日、年、小时和工作日?

问题描述

我有看起来像这样的数据。

VendorID    lpep_pickup_datetime    lpep_dropoff_datetime   store_and_fwd_flag
2   1/1/2018 0:18:50    1/1/2018 12:24:39 AM    N
2   1/1/2018 0:30:26    1/1/2018 12:46:42 AM    N
2   1/1/2018 0:07:25    1/1/2018 12:19:45 AM    N
2   1/1/2018 0:32:40    1/1/2018 12:33:41 AM    N
2   1/1/2018 0:32:40    1/1/2018 12:33:41 AM    N
2   1/1/2018 0:38:35    1/1/2018 1:08:50 AM N
2   1/1/2018 0:18:41    1/1/2018 12:28:22 AM    N
2   1/1/2018 0:38:02    1/1/2018 12:55:02 AM    N
2   1/1/2018 0:05:02    1/1/2018 12:18:35 AM    N
2   1/1/2018 0:35:23    1/1/2018 12:42:07 AM    N

所以,我转换df.lpep_pickup_datetime为日期时间,但最初它是作为字符串出现的。我不确定哪个更容易使用。我想在我当前的数据框中附加 5 个字段:年、月、日、工作日和小时。

我试过这个:

df['Year']=[d.split('-')[0] for d in df.lpep_pickup_datetime]
df['Month']=[d.split('-')[1] for d in df.lpep_pickup_datetime]
df['Day']=[d.split('-')[2] for d in df.lpep_pickup_datetime]

这给了我这个错误:AttributeError: 'Timestamp' object has no attribute 'split'

我试过这个:

df2 = pd.DataFrame(df.lpep_pickup_datetime.dt.strftime('%m-%d-%Y-%H').str.split('/').tolist(),
                   columns=['Month', 'Day', 'Year', 'Hour'],dtype=int)

df = pd.concat((df,df2),axis=1)

这给了我这个错误:AssertionError: 4 columns passed, passed data had 1 columns

基本上,我想解析df.lpep_pickup_datetime为年、月、日、工作日和小时,并将每个附加到同一个数据框。我怎样才能做到这一点?

谢谢!!

标签: pythonpython-3.xdataframe

解决方案


给你,首先我创建一个随机数据集,然后将列重命名为date你想要的名称,这样你就可以复制代码。Pandas 有很大一部分时间序列操作,您实际上不需要导入日期时间。在这里你可以找到更多关于它的信息:

import pandas as pd
date_rng = pd.date_range(start='1/1/2018', end='4/01/2018', freq='H')
df = pd.DataFrame(date_rng, columns=['date'])
df['lpep_pickup_datetime'] = df['date']
df['year'] = df['lpep_pickup_datetime'].dt.year
df['year'] = df['lpep_pickup_datetime'].dt.month
df['weekday'] = df['lpep_pickup_datetime'].dt.weekday
df['day'] = df['lpep_pickup_datetime'].dt.day
df['hour'] = df['lpep_pickup_datetime'].dt.hour
print(df)

输出:

                    date lpep_pickup_datetime  year  weekday  day  hour
0    2018-01-01 00:00:00  2018-01-01 00:00:00     1        0    1     0
1    2018-01-01 01:00:00  2018-01-01 01:00:00     1        0    1     1
2    2018-01-01 02:00:00  2018-01-01 02:00:00     1        0    1     2
3    2018-01-01 03:00:00  2018-01-01 03:00:00     1        0    1     3
4    2018-01-01 04:00:00  2018-01-01 04:00:00     1        0    1     4
...                  ...                  ...   ...      ...  ...   ...
2156 2018-03-31 20:00:00  2018-03-31 20:00:00     3        5   31    20
2157 2018-03-31 21:00:00  2018-03-31 21:00:00     3        5   31    21
2158 2018-03-31 22:00:00  2018-03-31 22:00:00     3        5   31    22
2159 2018-03-31 23:00:00  2018-03-31 23:00:00     3        5   31    23
2160 2018-04-01 00:00:00  2018-04-01 00:00:00     4        6    1     0

编辑:由于这不起作用(如本答案中的评论所述),我相信您的数据格式不正确。在应用任何东西之前试试这个:

df['lpep_pickup_datetime'] = pd.to_datetime(df['lpep_pickup_datetime'], format='%d/%m/%y %H:%M:%S')

dt.year如果此格式被正确识别,那么您使用, dt.month, dt.hour, dt.day,应该没有问题dt.weekday


推荐阅读