2017-05-15 1 views
2

Ich versuche einige Instanzen pro Stunde in einem großen Dataset zu zählen. Der folgende Code scheint auf Python 2.7 gut zu funktionieren, aber ich musste es mit allen aktualisierten Paketen auf Anaconda auf die neueste Version von Python aktualisieren. Wenn ich versuche, das Programm erhalte ich folgende str FehlerTypeError: nicht unterstützte Operandentypen für -: 'str' und 'str' in Python 3.x Anaconda

Code auszuführen:

import pandas as pd 
from datetime import datetime,time 
import numpy as np 

fn = r'00_input.csv' 
cols = ['UserId', 'UserMAC', 'HotspotID', 'StartTime', 'StopTime'] 
df = pd.read_csv(fn, header=None, names=cols) 

df['m'] = df.StopTime + df.StartTime 
df['d'] = df.StopTime - df.StartTime 

# 'start' and 'end' for the reporting DF: `r` 
# which will contain equal intervals (1 hour in this case) 
start = pd.to_datetime(df.StartTime.min(), unit='s').date() 
end = pd.to_datetime(df.StopTime.max(), unit='s').date() + pd.Timedelta(days=1) 

# building reporting DF: `r` 
freq = '1H' # 1 Hour frequency 
idx = pd.date_range(start, end, freq=freq) 
r = pd.DataFrame(index=idx) 
r['start'] = (r.index - pd.datetime(1970,1,1)).total_seconds().astype(np.int64) 

# 1 hour in seconds, minus one second (so that we will not count it twice) 
interval = 60*60 - 1 

r['LogCount'] = 0 
r['UniqueIDCount'] = 0 

for i, row in r.iterrows(): 
     # intervals overlap test 
     # https://en.wikipedia.org/wiki/Interval_tree#Overlap_test 
     # i've slightly simplified the calculations of m and d 
     # by getting rid of division by 2, 
     # because it can be done eliminating common terms 
    u = df[np.abs(df.m - 2*row.start - interval) < df.d + interval].UserID 
    r.ix[i, ['LogCount', 'UniqueIDCount']] = [len(u), u.nunique()] 

r['Date'] = pd.to_datetime(r.start, unit='s').dt.date 
r['Day'] = pd.to_datetime(r.start, unit='s').dt.weekday_name.str[:3] 
r['StartTime'] = pd.to_datetime(r.start, unit='s').dt.time 
r['EndTime'] = pd.to_datetime(r.start + interval + 1, unit='s').dt.time 

#r.to_csv('results.csv', index=False) 
#print(r[r.LogCount > 0]) 
#print (r['StartTime'], r['EndTime'], r['Day'], r['LogCount'], r['UniqueIDCount']) 

rout = r[['Date', 'StartTime', 'EndTime', 'Day', 'LogCount', 'UniqueIDCount'] ] 
#print rout 
rout.to_csv('o_1_hour.csv', index=False, header=False 

)

Wo finde ich Änderungen vornehmen eine fehlerfreie Ausführung

Fehler zu erhalten:

File "C:\Program Files\Anaconda3\lib\site-packages\pandas\core\ops.py", line 686, in <lambda> 
    lambda x: op(x, rvalues)) 

TypeError: unsupported operand type(s) for -: 'str' and 'str' 

Schätzen Sie die Hilfe, Vielen Dank im Voraus

+0

Welche Rückkehr 'print (df [ 'Startzeit'] dtypes.)' Und 'print (df [ 'Stoptime'] dtypes.)' 'Nach df = pd.read_csv (fn, header = None , Namen = cols, parse_dates = [3,4]) '? – jezrael

+0

@jezrael Es ist nicht einmal die print-Anweisungen, nach Änderungen erwähnt die Antwort unten und einschließlich der print-Anweisungen bekomme ich diesen Fehler 'TypeError: Kann 'int' Objekt nicht implizit in str konvertieren ' –

+0

Ok, aber ich kann nicht finde Fehler ohne es - so ist es unmöglich, diese 'dtypes' aus irgendeinem Grund zu bekommen? Denn wenn es ein Objekt ist, ist es notwendig, to_datetime (df ['StartTime'], errros = 'coerce') 'und wenn es sich um 'datetime64' handelt, dann ist das Problem anders. Auch die erste Fehlerzeile ist notwendig, da offensichtlich eine Fehlercodezeile angezeigt wird. – jezrael

Antwort

3

Ich denke, dass Sie ändern müssen header=0 für erste Zeile in Kopfzeile auswählen - dann Spaltennamen werden durch Liste ersetzt cols.

Wenn immer noch Probleme, müssen to_numeric, weil einige Werte in StartTime und StopTime Strings sind, die NaN analysiert werden, ersetzen durch 0 eine letzte convert Spalte int:

cols = ['UserId', 'UserMAC', 'HotspotID', 'StartTime', 'StopTime'] 
df = pd.read_csv('canada_mini_unixtime.csv', header=0, names=cols) 
#print (df) 

df['StartTime'] = pd.to_numeric(df['StartTime'], errors='coerce').fillna(0).astype(int) 
df['StopTime'] = pd.to_numeric(df['StopTime'], errors='coerce').fillna(0).astype(int) 

Keine Änderung:

df['m'] = df.StopTime + df.StartTime 
df['d'] = df.StopTime - df.StartTime 
start = pd.to_datetime(df.StartTime.min(), unit='s').date() 
end = pd.to_datetime(df.StopTime.max(), unit='s').date() + pd.Timedelta(days=1) 

freq = '1H' # 1 Hour frequency 
idx = pd.date_range(start, end, freq=freq) 
r = pd.DataFrame(index=idx) 
r['start'] = (r.index - pd.datetime(1970,1,1)).total_seconds().astype(np.int64) 

# 1 hour in seconds, minus one second (so that we will not count it twice) 
interval = 60*60 - 1 

r['LogCount'] = 0 
r['UniqueIDCount'] = 0 

ix ist in der letzten Version von Pandas veraltet, so verwenden Sie loc und Spaltenname ist in []:

for i, row in r.iterrows(): 
     # intervals overlap test 
     # https://en.wikipedia.org/wiki/Interval_tree#Overlap_test 
     # i've slightly simplified the calculations of m and d 
     # by getting rid of division by 2, 
     # because it can be done eliminating common terms 
    u = df.loc[np.abs(df.m - 2*row.start - interval) < df.d + interval, 'UserId'] 
    r.loc[i, ['LogCount', 'UniqueIDCount']] = [len(u), u.nunique()] 

r['Date'] = pd.to_datetime(r.start, unit='s').dt.date 
r['Day'] = pd.to_datetime(r.start, unit='s').dt.weekday_name.str[:3] 
r['StartTime'] = pd.to_datetime(r.start, unit='s').dt.time 
r['EndTime'] = pd.to_datetime(r.start + interval + 1, unit='s').dt.time 

print (r) 
+0

Sure ..Danke. Ich werde die Änderungen vornehmen und versuchen, das Programm auszuführen und Sie wissen zu lassen.Danke nochmal –

+1

Klar, ich hoffe es klappt gut. – jezrael

+0

Ich habe eine Reihe von Code von 2,7 auf 3.x zu migrieren .. Ich hoffe, das funktioniert für mich .. Eine unten von der Anzahl der schwebenden Heap zählt auch .. Danke ein Haufen .. –

1

df['d'] = df.StopTime - df.StartTime versucht, eine Zeichenfolge von einer anderen Zeichenfolge zu subtrahieren. Ich weiß nicht, wie Ihre Daten aussehen, aber wahrscheinlich möchten Sie StopTime und StartTime als Daten analysieren. Versuchen Sie

df = pd.read_csv(fn, header=None, names=cols, parse_dates=[3,4]) 

anstelle von df = pd.read_csv(fn, header=None, names=cols).

+0

Vielen Dank für die Antwort: Wenn ich die Anweisung ändere bekomme ich diesen Fehler 'TypeError: Kann 'int' Objekt nicht implizit in str konvertieren ' –

Verwandte Themen