Python 如何将DF中的字段解析为月、日、年、小时和工作日?

Python 如何将DF中的字段解析为月、日、年、小时和工作日?,python,python-3.x,dataframe,Python,Python 3.x,Dataframe,我有这样的数据 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

我有这样的数据

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_picku_datetime转换为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]
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)
这给了我这个错误:AttributeError:'Timestamp'对象没有属性'split'

我试过这个:

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]
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列传递,传递的数据有1列

基本上,我想将df.lpep_picku_datetime解析为年、月、日、工作日和小时,并将它们附加到相同的数据帧中。我该怎么做


谢谢

试试看。由于日期已经在datetime数据类型中,只需使用datetime属性提取每个部分

import pandas as pd
from datetime import datetime as dt

# Creating a fake dataset of dates.
dates = [dt.now().strftime('%d/%m/%Y %H:%M:%S') for i in range(10)]
df = pd.DataFrame({'lpep_pickup_datetime': dates})
df['lpep_pickup_datetime'] = pd.to_datetime(df['lpep_pickup_datetime'])

# Parse each date into its parts and store as a new column.
df['month'] = df['lpep_pickup_datetime'].dt.month
df['day'] = df['lpep_pickup_datetime'].dt.day
df['year'] = df['lpep_pickup_datetime'].dt.year
# ... and so on ...
输出:

  lpep_pickup_datetime  month  day  year
0  2019-09-24 16:46:10      9   24  2019
1  2019-09-24 16:46:10      9   24  2019
2  2019-09-24 16:46:10      9   24  2019
3  2019-09-24 16:46:10      9   24  2019
4  2019-09-24 16:46:10      9   24  2019
5  2019-09-24 16:46:10      9   24  2019
6  2019-09-24 16:46:10      9   24  2019
7  2019-09-24 16:46:10      9   24  2019
8  2019-09-24 16:46:10      9   24  2019
9  2019-09-24 16:46:10      9   24  2019

试试看。由于日期已经在datetime数据类型中,只需使用datetime属性提取每个部分

import pandas as pd
from datetime import datetime as dt

# Creating a fake dataset of dates.
dates = [dt.now().strftime('%d/%m/%Y %H:%M:%S') for i in range(10)]
df = pd.DataFrame({'lpep_pickup_datetime': dates})
df['lpep_pickup_datetime'] = pd.to_datetime(df['lpep_pickup_datetime'])

# Parse each date into its parts and store as a new column.
df['month'] = df['lpep_pickup_datetime'].dt.month
df['day'] = df['lpep_pickup_datetime'].dt.day
df['year'] = df['lpep_pickup_datetime'].dt.year
# ... and so on ...
输出:

  lpep_pickup_datetime  month  day  year
0  2019-09-24 16:46:10      9   24  2019
1  2019-09-24 16:46:10      9   24  2019
2  2019-09-24 16:46:10      9   24  2019
3  2019-09-24 16:46:10      9   24  2019
4  2019-09-24 16:46:10      9   24  2019
5  2019-09-24 16:46:10      9   24  2019
6  2019-09-24 16:46:10      9   24  2019
7  2019-09-24 16:46:10      9   24  2019
8  2019-09-24 16:46:10      9   24  2019
9  2019-09-24 16:46:10      9   24  2019

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

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应该不会有问题。

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

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应该不会有问题。

我没有“date\u range”,所以我只是尝试了一下:df['lpep\u picku\u datetime']=pd.to\u datetimedf['lpep\u picku\u datetime']df['year']=df['lpep\u picku datetime']dt.year看起来应该可以工作,但现在我所有的结果都是0和1。这还不够。这里可能有什么问题?我认为你专栏中的hwihc格式是不正确的,这就是为什么在申请dt.year时问你,你得到的结果与你的预期相差甚远。虽然这看起来很奇怪,但我相信检查数据类型可以帮助我们了解是否有问题。就是这样:lpep\u picku\u datetime datetime 64[ns]很好!它正在工作。我想“警局约会时间”真的很神奇。谢谢你的帮助。喜欢。是的,我相信pd.to_datetime没有解释我们想要的格式,这就是我添加它的原因。很乐意帮忙!我没有“date_range”,所以我只是简单地尝试了一下:df['lpep_pickup_datetime']=pd.to_datetimedf['lpep_pickup_datetime']df['year']=df['lpep_pickup_datetime'].dt.year看起来应该可以,但现在我所有的结果都是0和1。这还不够。这里可能有什么问题?我认为你专栏中的hwihc格式是不正确的,这就是为什么在申请dt.year时问你,你得到的结果与你的预期相差甚远。虽然这看起来很奇怪,但我相信检查数据类型可以帮助我们了解是否有问题。就是这样:lpep\u picku\u datetime datetime 64[ns]很好!它正在工作。我想“警局约会时间”真的很神奇。谢谢你的帮助。喜欢。是的,我相信pd.to_datetime没有解释我们想要的格式,这就是我添加它的原因。很乐意帮忙!我没有像您在示例中所示的“dates”字段,所以我只是这样做:df['lpep_pickup_datetime']=pd.DataFrame{'lpep_pickup_datetime':df}现在,我得到了这个错误。ValueError:如果使用所有标量值,则必须传递index@asher对不起,我不清楚。第一个块就是创建一个要在示例中使用的数据帧。只需使用块,将每个日期解析为。。。。在这里,日期被解析为每个部分的日、月、年等,并放入新的列中。明白了。谢谢我没有像您在示例中所示的“dates”字段,所以我只是这样做:df['lpep_pickup_datetime']=pd.DataFrame{'lpep_pickup_datetime':df}现在,我得到了这个错误。ValueError:如果使用所有标量值,则必须传递index@asher对不起,我不清楚。第一个块就是创建一个要在示例中使用的数据帧。只需使用块,将每个日期解析为。。。。在这里,日期被解析为每个部分的日、月、年等,并放入新的列中。明白了。谢谢这是答案吗
你的问题?这回答了你的问题吗?