繁体   English   中英

如何根据 pandas 中的时间仅更改某些特定行的日期?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM