我有以下数据框架可用于城市自行车旅行。但是,我在处理超过一个小时的行程时遇到一些问题(我想在数据模型中使用YYYYmmDDhh作为组合键)。因此,我要做的是创建一个可以与其他表连接的“ keyhour”列。如果start_hour == end_hour,则基于startup_at可以为YYYYmmDDhh。但是,如果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,endd_at = 2020-05-01 06:03:14.941000 + 00:00,start_hour = 3,end_hour = 6和TourID = 1,我想包含以下行:
keyhour; TourID
2020050103 ;1
2020050104 ;1
2020050105 ;1
2020050106 ;1
以及与此旅程ID相关的所有其他值(持续时间等)。
但是,我真的找不到在熊猫中做任何事情的方法。是否有可能还是我必须使用纯python重新编写源csv?
谢谢您的任何建议!
答案 0 :(得分:0)
假设您的数据帧为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