2014-02-20 2 views
5

pandas.read_csv() leitet die Arten von Spalten, aber ich kann es nicht erhalten, um einen Datums- oder Zeitdelta-Typ (z. B. datetime64, timedelta64) für Spalten abzuleiten, deren Werte wie offensichtliche Datums- und Zeitdeltas scheinen.Wie pandas.read_csv() abgerufen wird, um Datetime- und Timedelta-Typen aus CSV-Dateispalten abzuleiten?

Hier ist ein Beispiel CSV-Datei:

datetime,timedelta,integer,number,boolean,string 
20111230 00:00:00,one hour,10,1.6,True,Foobar 

Und einiger Code mit Pandas zu lesen:

dataframe = pandas.read_csv(path) 

Die Typen der Spalten auf diesem Datenrahmen als Objekt kommen, Objekt, int, schweben, Bool, Objekt. Sie sind alle so, wie ich es erwarten würde, mit Ausnahme der ersten zwei Spalten, die ich Datetime und Timedelta sein möchte.

Ist es möglich, Pandas dazu zu bringen, datetime- und timedelta-Spalten automatisch zu erkennen?

(Ich will nicht Pandas zu sagen haben, welche Spalten und Datetimes timedeltas oder die Formate sagen, ich will es sie automatisch versuchen und zu erkennen, wie es funktioniert für in, Schwimmer und Bool Spalten.)

+0

'' to_timedelta'' ist in 0.13 verfügbar: http://pandas.pydata.org/pandas-docs/version/0.13.0/timeseries.html#time-deltas-conversions; dass man zusammen mit '' to_datetime'' versuchen könnte, Spalten zu konvertieren. Dies ist jedoch kein "automatischer" Weg, dies von einer Saite aus zu tun. Es ist zu zweideutig. – Jeff

Antwort

2

Eine Sache, die Sie tun können, ist Ihr Datumsparser definieren strptime verwenden, wird dies Ihr Datumsformat handhaben, dann ist dies aber nicht automatisch:

In [59]: 

import pandas as pd 
import datetime as dt 

def parse_dates(x): 
    return dt.datetime.strptime(x, '%Y%m%d %H:%M:%S') 
# dict for word lookup, conversion 
word_to_int={'zero':0, 
    'one':1, 
    'two':2, 
    'three':3, 
    'four':4, 
    'five':5, 
    'six':6, 
    'seven':7, 
    'eight':8, 
    'nine':9} 


def str_to_time_delta(x): 
    num = 0 
    if 'hour' in x.lower(): 
     num = x[0:x.find(' ')].lower() 
    return dt.timedelta(hours = word_to_int[num]) 
df = pd.read_csv(r'c:\temp1.txt', parse_dates=[0],date_parser=parse_dates) 
df.dtypes 
Out[59]: 
datetime  datetime64[ns] 
timedelta   object 
integer    int64 
number    float64 
boolean    bool 
string    object 
dtype: object 
In [60]: 

Dann konvertieren zu timedeltas die dict verwenden und Funktion zu analysieren und konvertieren zu

df['timedelta'] = df['timedelta'].map(str_to_time_delta) 

In [61]: 

df.dtypes 
Out[61]: 
datetime  datetime64[ns] 
timedelta timedelta64[ns] 
integer    int64 
number    float64 
boolean     bool 
string    object 
dtype: object 
In [62]: 

df 
Out[62]: 
      datetime timedelta integer number boolean string 
0 2011-12-30 00:00:00 01:00:00  10  1.6 True Foobar 

[1 rows x 6 columns] 

Um Ihre Hauptfrage zu beantworten, kenne ich keine Möglichkeit, dies automatisch zu tun.

EDIT

Statt meine gewundenen Mapping-Funktion können Sie tun genau dies:

df['timedelta'] = pd.to_timedelta(df['timedelta']) 

Weitere bearbeiten

Wie @ Jeff bemerkt können Sie dies tun, anstatt mit strptime beim Lesen der CSV (in Version 0.13.1 und darüber):

df = pd.read_csv(r'c:\temp1.txt', parse_dates=[0], infer_datetime_format=True) 
+0

'' to_timedelta'' ersetzt die Notwendigkeit, die Zeitdeltas zu parsen (verfügbar in 0.13.0) – Jeff

+0

@Jeff war sich dessen nicht bewusst, danke für die Info. – EdChum

+1

brauche nicht die '' date_parser'' Funktion hier '' parse_dates = [0] '' funktioniert, könnte auch '' infer_datetime_format'' aktivieren, um das Datum automatisch abzurufen, siehe hier: http: // pandas. pydata.org/pandas-docs/stable/whatsnew.html#enhancements (muss immer noch die Spalte angeben) – Jeff

Verwandte Themen