Python 3.x 是否有一种pythonic方法可以将datetime上的数据帧与具有不规则datetimestamp的数据对合并

Python 3.x 是否有一种pythonic方法可以将datetime上的数据帧与具有不规则datetimestamp的数据对合并,python-3.x,pandas,dataframe,datetime,merge,Python 3.x,Pandas,Dataframe,Datetime,Merge,我有几个数据系列,其中每个数据点都以[ms]的精度保存一个时间戳。我想将这些系列合并到一个时间线上,所有时间戳的采样精度应为[s],最后应该有一个pd,其中第一列是datetime,具有系列中所有不同的时间戳。所有其他列在该datetime上合并 我的代码正在工作,但由于内存问题,无法处理大数据 数据如下所示: a_data; a_Timestamp; b_data; b_Timestamp; c_data ; c_Timestamp 1; 2019-07-24 12:00:00.123; 2

我有几个数据系列,其中每个数据点都以[ms]的精度保存一个时间戳。我想将这些系列合并到一个时间线上,所有时间戳的采样精度应为[s],最后应该有一个pd,其中第一列是datetime,具有系列中所有不同的时间戳。所有其他列在该datetime上合并

我的代码正在工作,但由于内存问题,无法处理大数据

数据如下所示:

a_data; a_Timestamp; b_data; b_Timestamp; c_data ; c_Timestamp
1; 2019-07-24 12:00:00.123; 2 ; 2019-07-24 12:00:00.234; 3 ; 2019-07-24 12:00:00.345;
2; 2019-07-24 12:00:03.123; 3 ; 2019-07-24 12:00:02.234; 4 ; 2019-07-24 12:00:03.645;
我的代码如下:

import numpy as np
import pandas as pd
import datetime as dt

def prepareData(df):
    dfm = None
    df = df.dropna(axis='columns',how='all')
    df = df.sort_index()  

    for col in df:
        dt = None
        if not "Timestamp" in col:
            series = pd.DataFrame({'DateTime' : pd.to_datetime(df[col + '_Timestamp']).astype('datetime64[s]'),col : df[col]})
            if mergedFrame is not None:
                dfm = dfm.merge(series, on='DateTime', how ='outer').sort_values('DateTime')           
            else:
                dfm = series    
        dfm = dfm.loc[~dfm.DateTime.duplicated(keep='first')]
    dfm = dfm.sort_index()
    dfm = dfm.fillna(method='ffill')
    dfm = dfm.fillna(method='bfill')
    dfm = dfm.fillna(0)
    return dfm.reset_index()       

df = pd.read_csv('file.csv', sep = ";", na_values="n/a" ,low_memory=False)
prepareData(df).to_csv( 'file_sampled.csv', sep = ';')    
结果应该是

DateTime; a_data; b_data ; c_data
2019-07-24 12:00:00; 1;2;3
2019-07-24 12:00:02; 1;3;3
2019-07-24 12:00:03; 2;3;3 
2019-07-24 12:00:04; 2;3;4

我得到了这个结果,但它占用的内存对于我的电脑来说太多了。我想有更好的方法来实现这一点。

首先,我们选择每个数据和每个时间戳列,并将它们并排放置:

x = pd.concat([pd.melt(df.iloc[:,::2], value_name='data'), pd.melt(df.iloc[:,1::2], value_name='DateTime').iloc[:,-1]], axis=1)
将日期时间字符串转换为日期时间,舍入为整秒并设置为索引:

x['DateTime'] = pd.to_datetime(x.DateTime).dt.round('s')
x = x.set_index('DateTime')
最后,我们分析数据:

x.pivot(columns='variable', values='data')
结果:

variable             a_data  b_data  c_data
DateTime                                   
2019-07-24 12:00:00     1.0     2.0     3.0
2019-07-24 12:00:02     NaN     3.0     NaN
2019-07-24 12:00:03     2.0     NaN     NaN
2019-07-24 12:00:04     NaN     NaN     4.0

这看起来更像蟒蛇,我想它是有效的。但我仍然得到了内存错误:(顺便说一句,我得到了48GB,.csv是520MB,也许我需要在几个步骤中重新排序,例如每次只对50行进行排序。这里的困难是,并非每一列都记录在同一个周期中。对于某些数据,5秒内有5个数据点,而对于其他数据,5秒内只有1个数据点。这导致了不同的长度每列的行数。如果按块来做呢?从csv(df.info()的最后一行)读取数据帧后,整个数据帧的内存使用量是多少?606列,数据类型:float64(343),object(264),内存使用量:1.9+GB。对于范围(0,len(l),50)内的i,您的意思是smth喜欢的块:产生l[i:i+n]似乎我运行您的代码太快了。上次尝试时内存没有被清除,所以以前它已经被阻止。代码现在正在进行中,目前没有错误。在第一行
x['variable']=x.variable之后插入
x['variable']=x.variable.astype('category')
。concat(…
也将减少内存消耗(当然,前提是您能够计算x)