Сохранение даты и времени в диапазоне относительно данных с использованием Python - PullRequest
0 голосов
/ 29 октября 2018

У меня есть набор данных

BDate,Snum,ArrTime,OID,TDate,TTime,VID
1/1/2018,72,05:59:01,7214,1/1/2018,12:06:20 AM ,7206
1/1/2018,72,06:04:33,7208,1/1/2018,12:36:31 AM,7205
1/1/2018,72,06:21:07,7216,1/1/2018,5:53:49 AM,7220
1/1/2018,80,06:29:01,8026,1/1/2018,5:59:10 AM,7214
1/1/2018,72,06:30:54,7218,1/1/2018,6:04:55 AM,7208
1/1/2018,72,06:33:54,7221,1/1/2018,06:21:17 AM,7216
1/1/2018,80,06:35:26,8018,1/1/2018,06:31:04 AM,7218
1/1/2018,72,09:38:34,7211,1/1/2018,1:40:38 PM,7209
1/1/2018,72,13:39:45,7209,,,

Цель, на которую я смотрю, - сопоставить столбцы в ArrTime с ближайшим временем в TTime, которого я уже достиг в своем другом посте.

Я пытаюсь улучшить анализ, создав временную привязку на основе столбца ArrTime. Как видно из данных, приведенных выше, 1-й тайм ArrTime равен 0:59:01, а последний ArrTime 13:39:45. Я хотел бы использовать эти 2 тайминга (но последний тайминг + 1 мин) как временную границу, чтобы удалить любое время в TTime, которое не попадает в диапазон.

Как показано ниже, мой код

mydataset = pd.read_csv("Test.csv", error_bad_lines=False, engine ='python', index_col= False,header = 0, sep = ",")
mydataset['Date1'] = pd.to_datetime(mydataset['BDate'] + ' ' + mydataset['ArrTime'], format='%d/%m/%Y %H:%M:%S')
datesAM = pd.to_datetime(mydataset['TDate'] + ' ' + mydataset['TTime'], format='%d/%m/%Y %I:%M:%S %p')
datesPM = pd.to_datetime(mydataset['TDate'] + ' ' + mydataset['TTime'], format='%d/%m/%Y %H:%M:%S %p')
mydataset['Date2'] = datesAM.mask(mydataset['TTime'].str.endswith('AM',na=False), datesPM)
#print(mydataset)

df1 = mydataset[['Date1','Snum', 'OID']].sort_values('Date1').dropna(subset=['I'])
df1['OID'] = df1['OID'].astype(np.int64)

a = df1['Date1'].iloc[0]
a1 = a.time().strftime('%H:%M:%S') 
print(a1)
b = df1['Date1'].iloc[-1]
b1 = b.time().strftime('%H:%M:%S') 
print(b1)

df2 = mydataset[['Date2','VID']].sort_values('Date2').dropna(subset=['VID'])
df2['VID'] = df2['VID'].astype(np.int64)

df2[df2['Date2'].indexer_between_time(a1,b1)]

#df2['Date2'] = pd.date_range(start = a1, end = b1)
#print(df2)

Я пытался использовать iloc, чтобы определить 1-е время и дату последнего времени, а затем преобразовать его в формат времени. Я попытался использовать pd.date_range и indexer_between_time, но все это дало мне ошибку, такую ​​как «Объект« Series »не имеет атрибута« indexer_between_time »» и «Длина значений не соответствует длине индекса»

Моя конечная цель состоит в том, чтобы удалить детали (не всю строку, а только TDate, TTime, VID), которые не попадают в диапазон, затем выполнить сопоставление ближайшего времени (время сопоставления уже достигнуто)

BDate,Snum,ArrTime,OID,TDate,TTime,VID
1/1/2018,72,05:59:01,7214,,,
1/1/2018,72,06:04:33,7208,,,
1/1/2018,72,06:21:07,7216,,,
1/1/2018,80,06:29:01,8026,1/1/2018,5:59:10 AM,7214
1/1/2018,72,06:30:54,7218,1/1/2018,6:04:55 AM,7208
1/1/2018,72,06:33:54,7221,1/1/2018,06:21:17 AM,7216
1/1/2018,80,06:35:26,8018,1/1/2018,06:31:04 AM,7218
1/1/2018,72,09:38:34,7211,1/1/2018,1:40:38 PM,7209  
1/1/2018,72,13:39:45,7209,,,

1 Ответ

0 голосов
/ 29 октября 2018

Я бы сделал это путем преобразования столбцов даты и времени в метки времени Unix, чтобы нам было легко сравнивать и фильтровать дату и время в пределах диапазона.

Вот как я бы это сделал:

mydataset = pd.read_csv("data.csv", error_bad_lines=False, engine ='python', index_col= False,header = 0, sep = ",")
mydataset['Date1'] = pd.to_datetime(mydataset['BDate'] + ' ' + mydataset['ArrTime'], format='%d/%m/%Y %H:%M:%S')

# Function to clean dates because the format is not consistent. For example: We have *6:04:55 AM* and *06:21:17 AM* 
def cleanDate(x):
    if str(x) == 'nan':
        return np.nan
    else:
        temp = ''
        if int(x.split(':')[0]) < 10:
            temp += '0' + str(int(x.split(':')[0])) +':'
        else:
            temp += x.split(':')[0] + ':'
        temp += x.split(':',1)[1]
        return temp

mydataset['TTime'] = mydataset['TTime'].apply(lambda x: cleanDate(x))
mydataset['Date2'] = pd.to_datetime(mydataset['TDate'] + ' ' + mydataset['TTime'], format='%d/%m/%Y %I:%M:%S %p', errors='ignore')
mydataset['Date2'] = pd.to_datetime(mydataset['Date2'])

# Convert Datetime to unix timestamp and create a new column
mydataset['tsArrTime'] = mydataset['Date1'].apply(lambda x: time.mktime(x.timetuple()))
mydataset['tsTTime'] = mydataset['Date2'].apply(lambda x: time.mktime(x.timetuple()) if str(x) != 'NaT' else 0)

# Get min and max timestamp from tsArrTime column
minTime = mydataset['tsArrTime'].min() 
maxTime = mydataset['tsArrTime'].max() + 60  # End datetime + 1 min

# Check if tsTTime is within the range else replace with empty string (Change it to whatever you want)
mydataset.loc[(mydataset['tsTTime'] < minTime) | (mydataset['tsTTime'] > maxTime), 'TTime'] = ''
mydataset.loc[(mydataset['tsTTime'] < minTime) | (mydataset['tsTTime'] > maxTime), 'TDate'] = ''
mydataset.loc[(mydataset['tsTTime'] < minTime) | (mydataset['tsTTime'] > maxTime), 'VID'] = ''
mydataset['TTime'] = mydataset['TTime'].fillna('')
mydataset['TDate'] = mydataset['TDate'].fillna('')
mydataset['VID'] = mydataset['VID'].fillna('')

mydataset = mydataset.drop(columns=['Date1','Date2','tsArrTime','tsTTime'])

Это вывод:

     BDate    Snum  ArrTime     OID     TDate       TTime           VID
0   1/1/2018    72  05:59:01    7214            
1   1/1/2018    72  06:04:33    7208            
2   1/1/2018    72  06:21:07    7216            
3   1/1/2018    80  06:29:01    8026    1/1/2018    05:59:10 AM     7214
4   1/1/2018    72  06:30:54    7218    1/1/2018    06:04:55 AM     7208
5   1/1/2018    72  06:33:54    7221    1/1/2018    06:21:17 AM     7216
6   1/1/2018    80  06:35:26    8018    1/1/2018    06:31:04 AM     7218
7   1/1/2018    72  09:38:34    7211    1/1/2018    01:40:38 PM     7209
8   1/1/2018    72  13:39:45    7209        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...