Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据熊猫中的时间仅更改某些特定行的日期?_Python_Pandas_Dataframe_Date_Time - Fatal编程技术网

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

Python 如何根据熊猫中的时间仅更改某些特定行的日期?,python,pandas,dataframe,date,time,Python,Pandas,Dataframe,Date,Time,我有一个数据框,看起来像这样: 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

我有一个数据框,看起来像这样:

    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寄存器(列车,ID):
reg=concat(列车,ID)
注册。附加(reg)
def concat(列车,id)
回程列车+str(ID))
def已注册(字符串):
如果字符串已注册:
返回真值
返回错误
#您的数据帧名称让我们支持df
df
计数=-1
对于df中的列车[“列车”]:
计数=计数+1
ID=df[“ID”][计数]
日期=df[“日期”][计数]
如果已注册(concat(train,ID))==真:
日期=日期+1
#您可能需要将日期对象转换为递增日期()
#增量(日期)

register(train,ID)
创建了一个名为
t
的新列,以维护各组第一次出现之间的
timedelta
及其值。
<代码> COND 是每个组考虑Data> 1天Delta < /C> >的条件,如果在每个数据集中有超过一天的差异,那么只需修改<代码> 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
输出

    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

您的示例与文本不一致:您希望更改第4行和第5行的日期,但在ID=2和Train=VSOE的行上,它们的值不相同。@joao第4行和第5行的ID相同,为2,Train相同,为VSOE。我不明白你的意思我明白了,我以为你指的是同一行中的相同值。我仍然无法理解您的规格:最后3行共享相同的Train和ID值,但您没有更改日期?是的,因为它们不符合条件。所以时间应该过了12点(24:00)。但最后三行从00:35开始到13:13结束,这意味着它发生在同一天,不需要更改日期好了,现在我明白了,我们需要首先从概念上对匹配ID和Train的行进行分组,然后检查整个组的时间条件。