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

如何为时间索引的Pandas DataFrame添加对应参考时间戳?

问题

我有一个以时间为索引的Pandas DataFrame,存储多个设备的时序数据,结构如下:

DateTimeIndex|device_name|col1|...|colN

其中DateTimeIndex和device_name无空值,其余列包含NaN值。另有一个来自其他数据源的参考时间戳列表self._lastinjection_items,希望为DataFrame的每一行添加首个不小于该行时间戳的参考时间戳,伪代码如下:

DataFrame['reference_timestamp'] = (reference_timestamps <= DataFrame.timestamp)[0]

我尝试用DataFrame.apply(lambda item: ...)实现,但无法访问每行的时间戳,请问最Pythonic的实现方式是什么?

当前代码

from cmath import inf
import numpy as np
import pandas as pd
from pandas import DataFrame

class IonSourceDataProcessor:

    _combined_data_frame: DataFrame = DataFrame()
    _input_file_name: str
    _lastinjection_items: []

    def __init__(self, input_file_name):
        self._input_file_name = input_file_name

    def build_injection_marker(self, item):
        ... 此处尝试实现代码,生成结构如下的结果DataFrame:
        DateTimeIndex|device_name|col1|...|colN|reference_timestamp

    def add_lastinjection_markers(self):
        ... 开发中,无需关注细节...
        for item in zip(self._combined_data_frame.values, self._combined_data_frame.index, self._combined_data_frame['nomen']):
            self.build_injection_marker(item)


    def get_data_grouped(self, groupby: str, axis: str or int = 0):
        return self._combined_data_frame.groupby(groupby, axis=axis)

    def integrate_trafo_contacq_rawdata(self, device_name: str, groupby_column: str, drop_columns: list):
        print('opening:', device_name)
        device_dataset: DataFrame = DataFrame(pd.read_hdf(self._input_file_name, key=device_name)).groupby(groupby_column).sum()
        device_dataset = device_dataset.drop(columns=drop_columns)
        for column in device_dataset.columns:
            device_dataset = device_dataset.rename(columns={column: '_'.join([column, 'sum'])})

        self._lastinjection_items = pd.to_datetime(device_dataset.index.values)

        device_dataset['device_name'] = '_'.join([device_name.split('_')[0], 'integral'])
        device_dataset.index = pd.to_datetime(device_dataset.index)

        self._combined_data_frame = pd.concat([self._combined_data_frame, device_dataset])

        return self

    def read_device_dataset(self, device_name: str):
        print('opening:', device_name)
        device_dataset: DataFrame = DataFrame(pd.read_hdf(self._input_file_name, key=device_name))
        device_dataset['device_name'] = device_name
        # data_set = data_set.reset_index(drop=True)
        # data_set['time'] = pd.to_datetime(data_set['time'])
        # data_set = data_set.set_index('time')

        if ('current' in device_dataset.columns) and ('voltage' in device_dataset.columns):
            device_dataset['power'] = (device_dataset['voltage'] * device_dataset['current'])
            device_dataset['resistance'] = (device_dataset['voltage'] / device_dataset['current'])
            device_dataset['resistance'] = device_dataset['resistance'].replace([inf, -inf, np.nan], 0.0)
        if 'currentset' in device_dataset.columns:
            device_dataset['currentset_gradient'] = (np.gradient(device_dataset['currentset']))

        self._combined_data_frame = pd.concat([self._combined_data_frame, device_dataset])

        return self


if __name__ == '__main__':

    processor = IonSourceDataProcessor('test_data.h5')

    processor = processor.integrate_trafo_contacq_rawdata('YR11DX1S1_ContAcq', 'lastinjection', ['lastextraction'])

    device_names = ['YRT1IN1E']
    for device_name in device_names:
        processor = processor.read_device_dataset(device_name)

    processor.add_lastinjection_markers()
    
    ...

示例数据

print(DataFrame)
              device_name  col1  col2 ...
DateTimeIndex                 
2016-11-30              A  NaN   0.1  ...
2017-04-30              A  NaN   0.2  ...  
2018-01-31              A  NaN   0.1  ...
2019-09-30              A  NaN   0.3  ...
2020-04-30              A  NaN   0.4  ...
2020-11-30              A  NaN   0.2  ...

reference_timestamps = ['2017-12-31','2019-01-31','2020-12-31']

预期结果

print(DataFrame)

              device_name  col1  col2 ...  ref_timestamp
DateTimeIndex
2016-11-30              A  NaN   0.1  ...  '2017-12-31'
2017-04-30              A  NaN   0.2  ...  '2017-12-31'
2018-01-31              A  NaN   0.1  ...  '2019-01-31'
2019-09-30              A  NaN   0.3  ...  '2020-12-31'
2020-04-30              A  NaN   0.4  ...  '2020-12-31'
2020-11-30              A  NaN   0.2  ...  '2020-12-31'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:03:21