我有一个如下所示的数据框:
ID Date Type Time
1 02.12.2021 Car 12:23
1 02.12.2021 Car 12:25
1 02.12.2021 Car 12:27
2 02.12.2021 Train 23:40
2 02.12.2021 Train 23:56
2 02.12.2021 Train 00:20
2 02.12.2021 Train 00:40
4 02.12.2021 Car 04:20
4 02.12.2021 Car 04:25
4 02.12.2021 Car 04:30
我想更改具有相同“ID”和“类型”的那些行的日期。因此,如果下一行的时间超过 23:59 并且与前一行具有相同的 ID 和类型,则下一行的日期应该更改。 应该是这样的:
ID Date Type Time
1 02.12.2021 Car 12:23
1 02.12.2021 Car 12:25
1 02.12.2021 Car 12:27
2 02.12.2021 Train 23:40
2 02.12.2021 Train 23:56
2 03.12.2021 Train 00:20
2 03.12.2021 Train 00:40
4 03.12.2021 Car 04:20
4 03.12.2021 Car 04:25
4 03.12.2021 Car 04:30
任何帮助将不胜感激。 非常感谢
答案 0 :(得分:1)
让我们尝试创建一个布尔系列,其中新日期开始以及每个日期的天数:
# Ensure Types Are Correct
df['Date'] = pd.to_datetime(df['Date'], format="%d.%m.%Y")
df['Time'] = pd.to_datetime(df['Time'])
df['Date'] = df['Date'] + \
df['Time'].diff().dt.days.lt(0).cumsum().astype('timedelta64[D]')
# Fix Formats
df['Date'] = df['Date'].apply(lambda x: x.strftime("%d.%m.%Y"))
df['Time'] = df['Time'].apply(lambda x: x.strftime('%H:%M'))
print(df)
输出:
ID Date Type Time
0 1 02.12.2021 Car 12:23
1 1 02.12.2021 Car 12:25
2 1 02.12.2021 Car 12:27
3 2 02.12.2021 Train 23:40
4 2 02.12.2021 Train 23:56
5 2 03.12.2021 Train 00:20
6 2 03.12.2021 Train 00:40
7 4 03.12.2021 Car 04:20
8 4 03.12.2021 Car 04:25
9 4 03.12.2021 Car 04:30
df['Time'].diff()
获取此时间值与前一个时间值之间的差异作为 TimeDelta。如果它属于前一天,如 23:56 移动到 00:20,则天数将为 -1。因此,可以根据存在 -1 的位置创建布尔索引。 df['Time'].diff().dt.days.dt.days.lt(0)
。使用此信息,cumsum
可用于创建一系列值,这些值代表组合在一起的天数,从 0 开始,每次遇到 -1 天时增加 1。
print(df['Time'].diff().dt.days.lt(0).cumsum())
0 0
1 0
2 0
3 0
4 0
5 1
6 1
7 1
8 1
9 1
Name: Time, dtype: int32
然后将类型更改为 timedelta64[D]
以将偏移量添加到每个日期。
print(df['Time'].diff().dt.days.lt(0).cumsum().astype('timedelta64[D]'))
0 0 days
1 0 days
2 0 days
3 0 days
4 0 days
5 1 days
6 1 days
7 1 days
8 1 days
9 1 days
Name: Time, dtype: timedelta64[ns]
答案 1 :(得分:0)
您可以做的是第一步将行程的开始添加到每一行,然后简单地比较并添加一天:
首先获取开始日期/时间
df=df.merge(df.groupby(["ID","Type"]).first(),on=["ID","Type"], suffixes=(None,'Start'))
然后比较并添加(如果适用):
df.loc[(df["Time"]<df["TimeStart"]),"Date"]=df["Date"]+pd.Timedelta(days=1)