2013-06-12 32 views
1

Я читаю текстовый файл, который имеет время (часы и минуты) и IP-адреса. Затем я хочу получить разницу во времени и сделать некоторые действия каждые 5 минут. Следующий код не вычисляет разницу во времени.Рассчитать разницу во времени в минутах

Пример текстового файла:

06:03 65.55.215.62 
06:04 157.56.92.152 
06:04 66.249.74.175 
06:05 173.199.116.171 

код:

time_ip = [] 
for line in open('minutes'): 
    time_ip.append(line.split(' '))  

df = pandas.DataFrame(time_ip) 
df['tvalue'] = df[0] 
df['delta'] = (df['tvalue']-df['tvalue']) 
+0

'df ['tvalue'] - df ['tvalue']' == 0, если 'df [0]' - число. – Elazar

+0

http://pandas.pydata.org/pandas-docs/dev/timeseries.html#time-deltas это имеет некоторые инструкции –

+0

@ Elazar IT дает ту же ошибку ... TypeError: неподдерживаемый тип операндов для -: 'str' и 'str' –

ответ

0

Вы можете использовать модуль datetime

import datetime 
with open('minutes', 'r') as myfile: 
    times = myfile.read().split()[::2] 
dates = [datetime.datetime.strptime(i, '%H:%M') for i in times] 
differences = [j-i for i, j in zip(dates[:-1], dates[1:])] 
print [divmod(i.seconds, 60)[0] for i in differences] 

распечаток:

[1, 0, 1] 
+0

для строки в открытом виде ('minutes'): times = line.split() [:: 2] date = [datetime.datetime.strptime (i, '% H:% M') для i в разы] разности = [ji для i, j в zip (даты [: - 1], даты [1:])] print [divmod (i.seconds, 60) для i в отличиях] ......... ... это просто напечатать массив emty @Haidro –

+0

@NilaniAlgiriyage Обновление – TerryA

+0

Для простого файла это нормально, но для большого файла данных вывод так запутан, как печатать эту строку за строкой? –

0
>>> import datetime 
>>> end = datetime.datetime.now() 
>>> start = datetime.datetime.now() 
>>> diff 
datetime.timedelta(0, 7, 424199) 
>>> diff = start - end 
>>> divmod(diff.days * 86400 + diff.seconds, 60) 
(0, 7) # 0 minutes, 7 seconds 
1

Вы должны использовать read_csv для чтения CSV в DataFrame:

In [1]: df = pd.read_csv(file_name, sep='\s+', header=None, names=['time', 'ip']) 

In [2]: df 
Out[2]: 
    time    ip 
0 06:03  65.55.215.62 
1 06:04 157.56.92.152 
2 06:04 66.249.74.175 
3 06:05 173.199.116.171 

Панды нет (пока) есть любые встроенные в объект времени, и делать это в Python не просто. .. вы можете сделать столбец времени временных объектов:

In [3]: df['time'] = df['time'].apply(lambda x: datetime.time(*map(int, x.split(':')))) 

In [4]: df 
Out[4]: 
     time    ip 
0 06:03:00  65.55.215.62 
1 06:04:00 157.56.92.152 
2 06:04:00 66.249.74.175 
3 06:05:00 173.199.116.171 

не в последнюю очередь потому, что вы не можете сделать arithmetic on datetime.time objects. Во всяком случае, я думаю, вы собираетесь попасть в липкую ситуацию, не имея здесь год/месяц/день, с одной стороны, как бороться с полуночью?

Итак, давайте начнем снова, если вы имели DateTime ...

In [5]: df = pd.read_csv(file_name, sep='\s+', header=None, names=['time', 'ip']) 

In [6]: df['time'] = pd.to_datetime(df['time']) # let's use todays 

In [7]: df 
Out[7]: 
       time    ip 
0 2013-06-12 06:03:00  65.55.215.62 
1 2013-06-12 06:04:00 157.56.92.152 
2 2013-06-12 06:04:00 66.249.74.175 
3 2013-06-12 06:05:00 173.199.116.171 

Тогда вы можете получить на разницу с помощью shift:

In [8]: df['time'].shift() 
Out[8]: 
0     NaT 
1 2013-06-12 06:03:00 
2 2013-06-12 06:04:00 
3 2013-06-12 06:04:00 
Name: time, dtype: datetime64[ns] 

In [9]: d['time'] - df['time'].shift() 
Out[9]: 
0  NaT 
1 00:01:00 
2 00:00:00 
3 00:01:00 
Name: time, dtype: timedelta64[ns] 

Намного проще. :)

+0

Почему эта ошибка?AttributeError: объект 'module' не имеет атрибута 'to_datetime' @Andy Hayden –

+0

@NilaniAlgiriyage, какую версию панд вы используете? Вам нужно перейти на последнюю стабильную версию. :) –

+0

df ['time']. Shift() производит тот же вывод с IP-адресами? @Andy Hayden –

Смежные вопросы