簡體   English   中英

根據下一行的列值計算 dataframe 中的新列值

[英]Calculating new column value in dataframe based on next row's column value

在過去的一年中,我缺乏使用 python 的經驗,這讓我相當生疏,我又要重新開始編碼了。

我有一個包含“start_time”列的事件的 dataframe。 我需要做的是創建一個“end_time”列,其時間值比下一行的 start_time 小 1 秒。 這是進行事件時間計算的要求。

所需的 output:

start_time  end_time
0   00:00:00  07:59:59
1   08:00:00  08:20:04
2   08:20:05  08:29:19
3   08:29:20  08:29:20
4   08:29:21  08:35:14
5   08:35:15  08:55:21
6   08:55:22  08:57:20
7   08:57:21  09:02:23
8   09:02:24  09:14:07
9   09:14:08  09:15:03

我目前有可以完成此操作的代碼,但是從我在這里讀到的任何內容以及我所記得的,我真的不應該在 for 循環中迭代 dataframe。

for ndx, row in df.iterrows():
    if ndx != df[atnp_df.columns[0]].count() - 1:
        df.iloc[ndx, 9] = pd.to_datetime(df.iloc[ndx+1, 8]) - timedelta(seconds=1)

(嘿,它有效,但它很......)

我如何以python方式執行此操作? 我知道解決方案應該是這樣的:

df['end_time'] = pd.to_datetime(df['start_time']) - timedelta(seconds=1)

但是,這會從同一行中的 start_time 中減去 1 秒。 我不太確定如何以這種方式訪問下一行的開始時間。

非常感謝任何和所有幫助!

offsets

df.assign(end_time=pd.to_timedelta(df.start_time).shift(-1).sub(pd.offsets.Second(1)))

  start_time        end_time
0   00:00:00 0 days 07:59:59
1   08:00:00 0 days 08:20:04
2   08:20:05 0 days 08:29:19
3   08:29:20 0 days 08:29:20
4   08:29:21 0 days 08:35:14
5   08:35:15 0 days 08:55:21
6   08:55:22 0 days 08:57:20
7   08:57:21 0 days 09:02:23
8   09:02:24 0 days 09:14:07
9   09:14:08             NaT

稍微清理一下並返回格式化的字符串:

s = pd.to_timedelta(df.start_time).shift(-1).sub(pd.offsets.Second(1))

df.assign(end_time=s.add(pd.Timestamp('now').normalize()).dt.time.astype(str))

  start_time  end_time
0   00:00:00  07:59:59
1   08:00:00  08:20:04
2   08:20:05  08:29:19
3   08:29:20  08:29:20
4   08:29:21  08:35:14
5   08:35:15  08:55:21
6   08:55:22  08:57:20
7   08:57:21  09:02:23
8   09:02:24  09:14:07
9   09:14:08       NaT
​

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM