python - 熊猫使用 IF 条件添加多行
问题描述
我有以下城市自行车旅行的数据框。但是,我在处理超过一小时的行程时遇到了一些问题(我想在我的数据模型中使用 YYYYmmDDhh 作为复合键)。所以我想做的是创建一个可以与其他表连接的列“keyhour”。这将是 YYYYmmDDhh,基于started_at IF start_hour == end_hour。但是,如果 end_hour 大于 start_hour,我想将具有相同 TourID 的那么多行插入到我的数据框中,以表明行程已经持续了几个小时。
started_at ended_at duration start_station_id start_station_name start_station_description ... end_station_description end_station_latitude end_station_longitude TourID start_hour end_hour
0 2020-05-01 03:03:14.941000+00:00 2020-05-01 03:03:14.941000+00:00 635 484 Karenlyst allé ved Skabos vei ... langs Drammensveien 59.914145 10.715505 0 3 3
1 2020-05-01 03:05:48.529000+00:00 2020-05-01 03:05:48.529000+00:00 141 455 Sofienbergparken sør langs Sofienberggata ... ved Sars gate 59.921206 10.769989 1 3 3
2 2020-05-01 03:13:33.156000+00:00 2020-05-01 03:13:33.156000+00:00 330 550 Thereses gate ved Bislett trikkestopp ... ved Kristian IVs gate 59.914767 10.740971 2 3 3
3 2020-05-01 03:14:14.549000+00:00 2020-05-01 03:14:14.549000+00:00 479 597 Fredensborg ved rundkjøringen ... ved Oslo City 59.912334 10.752292 3 3 3
4 2020-05-01 03:20:12.355000+00:00 2020-05-01 03:20:12.355000+00:00 629 617 Bjerregaardsgate Øst ved Uelands gate ... langs Oslo gate 59.908255 10.767800 4 3 3
例如,如果started_at = 2020-05-01 03:03:14.941000+00:00,end_at = 2020-05-01 06:03:14.941000+00:00,start_hour = 3,end_hour = 6 和 TourID = 1,我想有行:
关键时间;旅游ID
2020050103 ;1
2020050104 ;1
2020050105 ;1
2020050106 ;1
以及与此行程 ID 相关的所有其他值(持续时间等)。
但是,我真的无法在 Pandas 中找到任何方法。是否有可能或者我必须使用纯 python 来重写我的源 csv?
感谢您的任何建议!
解决方案
假设您的数据框是df
并且您拥有import pandas as pd
# convert to datetime and rounddown to hour
df['started_at'] = pd.to_datetime(df['started_at']).dt.floor(freq='H')
df['ended_at'] = pd.to_datetime(df['ended_at']).dt.floor(freq='H')
# this creates a list of hourly datetime ranges from started_at to ended_at
df['keyhour'] = df.apply(lambda x: list(pd.date_range(x['started_at'], x['ended_at'], freq="1H")), axis='columns')
# this just expands to row each element in the list of keyhour column
df = df.explode('keyhour')
# conversts it to a string, of the format you specified
df['keyhour'] = df['keyhour'].dt.strftime('%Y%m%d%H')
df
推荐阅读
- r - 如何在R中使用百分位数(分位数)对变量值进行分类?
- javascript - 查询聚合物 3 中页面中的所有元素(queryselectorall)由于阴影元素而无法正常工作
- theia - 如何安装和运行 Theia,基于浏览器的 IDE?
- java - 定义方法时Java中的泛型抛出错误
- android - 如何让 JeroMQ 与 Android Studio 一起工作?
- sql - SQL中的realdate是什么?
- php - 来自不带问号的 URL 的 $_GET 属性
- python-3.x - 如果所有 str 相同,则减少 df 中逗号分隔的 str
- javascript - 使用 Javascript 有条件地显示选项卡和输入字段
- android - 在 Android 中将 TextView 渲染到 TextureView