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的行进行分组,然后检查整个组的时间条件。