Чтобы избежать каких-либо проблем, которые могут остаться незамеченными во время агрегации, я бы рекомендовал сначала перевести столбец времени в фактические даты. Тогда это простая группа по операции, которую вы ищете.
Вот мое предложение:
Загрузить данные:
a = '''TIME LEVELS_A
0 0 0
1 900 0
2 1800 0
3 2700 0
4 3600 0
5 4500 0
'''
b = '''TIME LEVELS_B
0 0 2.16
1 600 2.16
2 1200 2.12
3 1800 1.989382667
4 2400 1.989382667
5 3000 1.989382667
'''
df_a = pd.DataFrame.from_csv(io.StringIO(a), sep='\s+')
df_b = pd.DataFrame.from_csv(io.StringIO(b), sep='\s+')
Решение
import datetime as dt
import pandas as pd
reference_date = dt.datetime(2019,1,1) # Arbitrary date used for reference
df_a.index = reference_date + df_a['TIME'].astype('timedelta64[s]')
df_b.index = reference_date + df_b['TIME'].astype('timedelta64[s]')
new_a = df_a['LEVELS_A'].groupby(pd.TimeGrouper(freq='30T')).apply(lambda x: x.tolist())
new_b = df_b['LEVELS_B'].groupby(pd.TimeGrouper(freq='30T')).apply(lambda x: x.tolist())
merged_df = pd.concat({'LEVELS_A': new_a, 'LEVELS_B': new_b}, axis = 1, sort=True)
merged_df.index = (merged_df.index - reference_date).seconds # Return to original Time format
Выход:
LEVELS_A LEVELS_B
0 [0, 0] [2.16, 2.16, 2.12]
1800 [0, 0] [1.989, 1.989, 1.989]
3600 [0, 0] NaN
[ 1110] Sidenote:
Если все, что вам нужно, это максимальный элемент в каждом списке, добавьте следующее.
merged_df.applymap(lambda x: max(x) if isinstance(x, list) else np.nan)
Вывод:
LEVELS_A LEVELS_B
0 0 2.160000
1800 0 1.989383
3600 0 NaN
Я удивлен, что Ожидают, не сделал этого для Вас, так как это записано для просто этих видов вещей.
Perl более прост до некоторой степени и может получить задание как сделанный. Но с Perl, Вы не обеспокоитесь Telnet, можно вместо этого открыть порт 25 непосредственно.
Если Вы действительно хотите тренироваться, Ваш сервер получают источник для Осады и изменяют его для разговора SMTP вместо HTTP. Это было моим любимым инструментом для того, чтобы проверить производительность Apache, и я уверен, что не было бы слишком трудно заставить его протестировать Sendmail.
Попробуйте netcat: http://netcat.sourceforge.net/
Это позволит Вам отправить и получить данные по сокету. telnet не то, что Вы хотите - это для интерактивного использования.
ожидайте, что перенесенный netcat (вместо telnet) является, вероятно, лучшей начальной ставкой. Но, если бы Вам действительно нужно к этому, я использовал бы жемчуг. Существуют клиентские библиотеки SMTP для него.