You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中Datetime格式转换及指定条件下毫秒累计求和问题

嗨,我来帮你搞定这两个Pandas相关的问题,都是日常处理时序数据经常遇到的场景,直接上干货:

问题1:将自定义格式的时间字符串转为标准datetime类型

你的时间字符串格式是2018/03/06 00:01:27:744,核心是最后三位是毫秒值,Pandas的pd.to_datetime()可以直接处理,只要指定正确的格式字符串就行。

具体代码如下:

import pandas as pd

# 假设你的DataFrame叫df
df['Time'] = pd.to_datetime(df['Time'], format='%Y/%m/%d %H:%M:%S:%f')

这里的格式字符串%Y/%m/%d %H:%M:%S:%f对应:

  • %Y:4位年份
  • %m:2位月份
  • %d:2位日期
  • %H:24小时制的小时
  • %M:分钟
  • %S:秒
  • %f:微秒(虽然你的字符串是三位毫秒,但Pandas会自动补零到六位,不影响后续的时间计算)

转换完成后,df['Time']就变成了Pandas的datetime64[ns]类型,支持所有时间相关的操作。

问题2:指定条件下的时间毫秒累计求和

首先得确保Time列已经转成了datetime类型(也就是问题1解决后的状态),接下来我们分步骤实现你要的逻辑:

步骤1:定义条件掩码

先筛选出Sensor1=0且Sensor2=1的行:

mask = (df['Sensor1'] == 0) & (df['Sensor2'] == 1)

步骤2:计算时间差并分组累计

我们需要把连续满足条件的行归为一组,然后在每组内计算从第一行到当前行的累计时间差(示例里用秒为单位,若要毫秒只需调整转换逻辑):

import numpy as np

# 计算每行与前一行的时间差,转成秒
df['time_diff'] = df['Time'].diff().dt.total_seconds()

# 根据条件分组:把连续满足mask的行分到同一组
df['group_id'] = (~mask).cumsum()

# 在每组内累计时间差,不满足条件的行设为NaN
df['TimeCumsum'] = np.where(
    mask,
    df.groupby('group_id')['time_diff'].cumsum(),
    np.nan
)

# 可以删掉中间列,保持DataFrame整洁
df.drop(['time_diff', 'group_id'], axis=1, inplace=True)

逻辑解释:

  • (~mask).cumsum():当遇到不满足条件的行时,~mask为True,累加值加1,这样就能把连续满足条件的行分到同一个group_id里。
  • groupby('group_id')['time_diff'].cumsum():在每个组内对时间差做累加,第一行的时间差是NaN,所以第一行会显示NaN,第二行是第一到第二的时间差,第三行是前两个时间差的和,以此类推。
  • np.where:只在满足条件的行填充累计值,其他行留空(NaN),和你给出的示例格式一致。

如果需要毫秒单位的累计,只需要把dt.total_seconds()改成dt.total_seconds() * 1000就行,这样累计结果就是毫秒数。


内容的提问来源于stack exchange,提问作者GrayHash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:14:32