python - 如何将 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
为年、月、日、工作日和小时,并将每个附加到同一个数据框。我怎样才能做到这一点?
谢谢!!
解决方案
给你,首先我创建一个随机数据集,然后将列重命名为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
。
推荐阅读
- postgresql - 使用 SUM 更新 postgresql
- javascript - Javascript:检查是否存在重复键,为重复键添加相应的子项
- windows - postgres C:: 权限被拒绝使用 windows
- asp.net-core - 是否可以在 ASP .NET Core 中使用 Swashbuckle 在 Swagger 2.0 和 Open API 3 格式中公开相同的 Swagger JSON?
- spring - 在 Spring Boot 中配置特定资源
- swift - 获取应用程序最前面窗口的更好方法 - Swift
- node.js - 参考其他集合的种子 mongo 数据库
- javascript - 将 JSON 文件转换为 javascript 中的数组以可视化 ChartsJS 中的数据
- makefile - 在 GNU makefile 中使用依赖项
- regex - 正则表达式限制可选的出现