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
相关产品推荐
相关产品推荐

