[英]how to change the date for only some specific rows based on time in pandas?
我有一个 dataframe 看起来像这样:
Date Train Station Time ID
0 02.10.2020 Flixtrain London 10:40 1
1 02.10.2020 Flixtrain Berlin 20:30 1
2 02.10.2020 Flixtrain Hamburg 23:45 1
3 02.10.2020 VSOE Amesterdam 21:30 2
4 02.10.2020 VSOE Cologne 00:50 2
5 02.10.2020 VSOE Berlin 04:30 2
6 02.10.2020 ICE-220 Warschau 12:35 3
7 02.10.2020 ICE-220 Breslau 17:40 3
8 02.10.2020 ICE-220 Prag 23:13 3
9 02.10.2020 ICE-342 Wien 00:35 4
7 02.10.2020 ICE-342 Salzburg 07:42 4
8 02.10.2020 ICE-342 Munich 13:13 4
我想要做的是更改时间经过 24:00 的日期,但仅限于那些在“ID”和“Train”中具有相同值的行。 之后行的日期应保持不变。
我期望的是:
Date Train Station Time ID
0 02.10.2020 Flixtrain London 10:40 1
1 02.10.2020 Flixtrain Berlin 20:30 1
2 02.10.2020 Flixtrain Hamburg 23:45 1
3 02.10.2020 VSOE Amesterdam 21:30 2
4 03.10.2020 VSOE Cologne 00:50 2
5 03.10.2020 VSOE Berlin 04:30 2
6 02.10.2020 ICE-220 Warschau 12:35 3
7 02.10.2020 ICE-220 Breslau 17:40 3
8 02.10.2020 ICE-220 Prag 23:13 3
9 02.10.2020 ICE-342 Wien 00:35 4
7 02.10.2020 ICE-342 Salzburg 07:42 4
8 02.10.2020 ICE-342 Munich 13:13 4
有可能这样做吗?任何帮助将不胜感激。 非常感谢
您可以从创建一个数组开始,以确定日期是否应该增加。 假设我们将其命名为“已注册”。 然后,您可以连接火车的名称和 ID 以检查日期是否应该增加。
registered = [] def register( train, ID ): reg = concat( train, ID ) registered.append( reg ) def concat ( train, id ) return train + str(ID) ) def isRegistered( string ): if string in registered: return True return False #your DataFrame name let's suppuse df df count = -1 for train in df["Train" ]: count = count + 1 ID = df["ID"][ count ] date = df["Date" ][count] if isRegistered( concat( train, ID ) ) == True: date = date + 1 # you may need to convert date object to incremet the day () #increment(date ) register( train, ID )
创建了一个名为t
的新列,以维护first occurence of each group
与其值之间的timedelta
。
cond
是每组考虑1 day of delta
的条件,如果在您的数据集中,每组的差异超过 1 天,则只需相应地修改cond
。
df['t'] = pd.to_datetime(df.Time, format='%H:%M')
df.Date = pd.to_datetime(df.Date, dayfirst=True)
cond = df.groupby(['Train','ID']
).t.transform('first') - df.groupby(
['Train','ID']).t.transform(
lambda x: x.values) > pd.Timedelta('0 days')
df.Date = df.Date.mask(cond,df.Date + pd.Timedelta(days=1))
df = df.drop('t',1)
df
Output
Date Train Station Time ID
0 2020-10-02 Flixtrain London 10:40 1
1 2020-10-02 Flixtrain Berlin 20:30 1
2 2020-10-02 Flixtrain Hamburg 23:45 1
3 2020-10-02 VSOE Amesterdam 21:30 2
4 2020-10-03 VSOE Cologne 00:50 2
5 2020-10-03 VSOE Berlin 04:30 2
6 2020-10-02 ICE-220 Warschau 12:35 3
7 2020-10-02 ICE-220 Breslau 17:40 3
8 2020-10-02 ICE-220 Prag 23:13 3
9 2020-10-02 ICE-342 Wien 00:35 4
10 2020-10-02 ICE-342 Salzburg 07:42 4
11 2020-10-02 ICE-342 Munich 13:13 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.