如何根据熊猫中的时间列更改日期列

时间:2021-05-07 15:21:04

标签: python pandas dataframe date datetime

我有一个如下所示的数据框:

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

任何帮助将不胜感激。 非常感谢

2 个答案:

答案 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)