使用python从数据处理中的每一行读取所有数据

时间:2018-12-20 08:31:28

标签: python pandas dataframe

我正在尝试处理一组数据以进行合并。合并之前,有一些过程。因为我有一个单独的日期和时间列以及一个辅助组合的datetime列,所以我必须使用merge_asof来匹配这两组日期时间之间的最接近时间。在此之前,我将需要捕获第一组日期时间的第一和最后一个时间戳,以用作第二组数据的时间边界。为此,我将datetime转换为unix时间戳进行比较。由于两组日期时间没有相同数量的值(例如,第一组日期时间具有多达20行的数据,而第二组日期时间具有多达50行的数据)。我只能设法将第二个设置的日期时间缩短到第20行,因为从第21行开始没有第一个数据集的日期时间。

数据类似于:

Date,Arr,Qdate
7/10/2011,6:05:04,7/10/2011  12:02:57 AM
7/10/2011,6:12:16,7/10/2011  6:09:41 AM
7/10/2011,6:18:00,7/10/2011  6:12:27 AM
7/10/2011,19:34:47,7/10/2011  7:02:04 PM
7/10/2011,19:52:21,7/10/2011  7:29:20 PM
,,7/10/2011  7:34:53 PM
,,7/10/2011  7:41:35 PM
,,7/10/2011  7:52:23 PM
,,7/10/2011  7:58:21 PM
,,7/10/2011  8:01:22 PM

完成处理后,它使用下面的代码成功地将时间范围限制为第一个和最后一个日期时间

mydataset = pd.read_csv(x + ".csv", error_bad_lines=False, engine ='python', index_col= False,header = 0, sep = ",")
mydataset['Date1'] = pd.to_datetime(mydataset['Date'] + ' ' + mydataset['Arr'], format='%d/%m/%Y %H:%M:%S')  
mydataset['Date2'] = pd.to_datetime(mydataset['Qdate'] , format='%d/%m/%Y %I:%M:%S %p', errors='ignore')
mydataset['Date2'] = pd.to_datetime(mydataset['Date2'])
mydataset = mydataset[mydataset['Date1'].notnull()]
mydataset['tsArrTime'] = mydataset['Date1'].apply(lambda x: time.mktime(x.timetuple()))                                     #conversion of unix timestamp
mydataset['tsTTime'] = mydataset['Date2'].apply(lambda x: time.mktime(x.timetuple()) if str(x) != 'NaT' else 0)             #conversion of unix timestamp
minTime = mydataset['tsArrTime'].min()                                                                                      
maxTime = mydataset['tsArrTime'].max() + 60                                                                                 
mydataset.loc[(mydataset['tsTTime'] < minTime) | (mydataset['tsTTime'] > maxTime), 'Qdate'] = ''                           
mydataset.loc[(mydataset['tsTTime'] < minTime) | (mydataset['tsTTime'] > maxTime), 'VID'] = ''                              
mydataset = mydataset.drop(columns=['Date1','Date2','tsArrTime','tsTTime'])

这是结果:

Date,Arr,Qdate
7/10/2011,6:05:04,
7/10/2011,6:12:16,7/10/2011  6:09:41 AM
7/10/2011,6:18:00,7/10/2011  6:12:27 AM
7/10/2011,19:34:47,7/10/2011  7:02:04 PM
7/10/2011,19:52:21,7/10/2011  7:29:20 PM

但是缺少一些数据,所以我想实现这一目标

Date,Arr,Qdate
7/10/2011,6:05:04,
7/10/2011,6:12:16,7/10/2011  6:09:41 AM
7/10/2011,6:18:00,7/10/2011  6:12:27 AM
7/10/2011,19:34:47,7/10/2011  7:02:04 PM
7/10/2011,19:52:21,7/10/2011  7:29:20 PM
,,7/10/2011  7:34:53 PM
,,7/10/2011  7:41:35 PM
,,7/10/2011  7:52:23 PM

1 个答案:

答案 0 :(得分:0)

我已通过将数据分为2个不同的数据集来进行时间边界处理,然后进行合并来解决此问题

mydataset1 = mydataset[mydataset['Date1'].notnull()]
mydataset2 = mydataset.Date2
print(mydataset1)
print(mydataset2)
tsArrTime = mydataset1.Date1.apply(lambda x: time.mktime(x.timetuple()))                                     #conversion of unix timestamp
tsTTime = mydataset2.apply(lambda x: time.mktime(x.timetuple()))             #conversion of unix timestamp
minTime = tsArrTime.min()                                                                                      
maxTime = tsArrTime.max() + 60                                                                                 
print(tsArrTime)
print(tsTTime)
mydataset.loc[(tsTTime < minTime) | (tsTTime > maxTime), 'Qdate'] = ''                            
mydataset.loc[(tsTTime < minTime) | (tsTTime > maxTime), 'VID'] = ''