如何为时间索引的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
相关产品推荐
相关产品推荐

