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
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
@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 ' –
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