熊猫在IF条件下添加多行

时间:2020-06-07 12:47:28

标签: python pandas

我有以下数据框架可用于城市自行车旅行。但是,我在处理超过一个小时的行程时遇到一些问题(我想在数据模型中使用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?

谢谢您的任何建议!

1 个答案:

答案 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