如何在DataFrame中计算时间戳的微秒累计求和值?
如何在DataFrame中计算时间戳的微秒累计求和值?
看起来你需要在指定的行区间内,计算时间戳的相邻差值累计和,并且只在A=1.0开始到B=1.0的区间内生效。下面是基于pandas的完整解决方案,完全匹配你的需求:
步骤1:加载数据并转换时间格式
首先把输入数据转为DataFrame,同时将time列转换成支持微秒精度的datetime类型,这是后续计算的基础:
import pandas as pd import numpy as np # 输入数据整理 data = { 'time': ['2018-04-04 00:01:52.474', '2018-04-04 00:01:52.676', '2018-04-04 00:01:52.692', '2018-04-04 00:01:52.754', '2018-04-04 00:01:52.817', '2018-04-04 00:01:52.848', '2018-04-04 00:01:52.895', '2018-04-04 00:01:53.051', '2018-04-04 00:01:53.082', '2018-04-04 00:01:53.160', '2018-04-04 00:01:53.316', '2018-04-04 00:01:53.332'], 'A': [0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 'B': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0] } df = pd.DataFrame(data) # 转换为带微秒的datetime类型,确保精度 df['time'] = pd.to_datetime(df['time'], format='%Y-%m-%d %H:%M:%S.%f')
步骤2:计算相邻行的时间差
先算出每行与前一行的时间差,单位为秒(保留微秒级精度):
# 计算时间差,转换为秒数 df['time_diff'] = df['time'].diff().dt.total_seconds()
步骤3:确定累计求和的有效区间
根据你的需求,我们只在第一个A=1.0的行到第一个B=1.0的行这个区间内计算累计和:
# 找到累计起始点:第一个A=1.0的行索引 start_idx = df[df['A'] == 1.0].index[0] # 找到累计结束点:第一个B=1.0的行索引 end_idx = df[df['B'] == 1.0].index[0] # 创建掩码,标记哪些行需要计算累计 mask = (df.index >= start_idx) & (df.index <= end_idx)
步骤4:计算时间差的累计和
在有效区间内计算时间差的累计和,并将起始行的累计值设为0.0,同时保留三位小数匹配你的输出格式:
# 仅在掩码范围内计算累计和 df['cumsum_Time'] = np.where( mask, # 从起始行的下一行开始累加,再对齐整个DataFrame的索引 df['time_diff'].iloc[start_idx+1:end_idx+1].cumsum().reindex(df.index), np.nan ) # 起始行的累计值设为0.0 df.loc[start_idx, 'cumsum_Time'] = 0.0 # 保留三位小数,和你的期望输出一致 df['cumsum_Time'] = df['cumsum_Time'].round(3)
步骤5:添加额外标记(匹配你的变更输出)
如果需要添加区间标记和注释,可以执行以下代码:
# 添加区间标记列 df['interval'] = np.where(mask, 1, np.nan) # 添加自定义注释 df.loc[start_idx, 'note'] = 'this1' df.loc[end_idx, 'note'] = 'this2'
最终结果
运行后得到的核心结果如下,完全匹配你的变更输出要求:
| time | A | B | time_diff | cumsum_Time | interval | note |
|---|---|---|---|---|---|---|
| 2018-04-04 00:01:52.474000 | 0.0 | 0.0 | NaN | NaN | NaN | NaN |
| 2018-04-04 00:01:52.676000 | 0.0 | 0.0 | 0.202 | NaN | NaN | NaN |
| 2018-04-04 00:01:52.692000 | 0.0 | 0.0 | 0.016 | NaN | NaN | NaN |
| 2018-04-04 00:01:52.754000 | 1.0 | 0.0 | 0.062 | 0.0 | 1.0 | this1 |
| 2018-04-04 00:01:52.817000 | 1.0 | 0.0 | 0.063 | 0.063 | 1.0 | NaN |
| 2018-04-04 00:01:52.848000 | 1.0 | 0.0 | 0.031 | 0.094 | 1.0 | NaN |
| 2018-04-04 00:01:52.895000 | 1.0 | 0.0 | 0.047 | 0.141 | 1.0 | NaN |
| 2018-04-04 00:01:53.051000 | 1.0 | 0.0 | 0.156 | 0.297 | 1.0 | NaN |
| 2018-04-04 00:01:53.082000 | 1.0 | 0.0 | 0.031 | 0.328 | 1.0 | NaN |
| 2018-04-04 00:01:53.160000 | 1.0 | 0.0 | 0.078 | 0.406 | 1.0 | NaN |
| 2018-04-04 00:01:53.316000 | 1.0 | 1.0 | 0.156 | 0.562 | 1.0 | this2 |
| 2018-04-04 00:01:53.332000 | 1.0 | 1.0 | 0.016 | NaN | NaN | NaN |
内容的提问来源于stack exchange,提问作者GrayHash
相关产品推荐
相关产品推荐

