2017-01-25 17 views
0

hatte ich die unten csv Datenändern Datumsformat in Pandas

country,sale,date,trans_factor 
India,403171,12/01/2012,1 
Bhutan,394096,12/01/2012,2 
Nepal,super,12/01/2012,3 
madhya,355883,12/01/2012,4 
sudan,man,12/01/2012,5 

csv_data = pandas.read_csv(csv_file_data, skiprows=[0], names=original_csv_header, parse_dates=True, infer_datetime_format=True) 

print csv_data 

    country sale  date trans_factor 
0 India 403171 12/01/2012    1 
1 Bhutan 394096 12/01/2012    2 
2 Nepal super 12/01/2012    3 
3 madhya 355883 12/01/2012    4 
4 sudan  man 12/01/2012    5 

Auch parse_dates=True der obige Code nicht die Werte 12/01/2012-2012-01-12 nach dem Hinzufügen geändert, und ich weiß nicht, warum

ich möchte die Datumsspalte im Format '%d/%m/%Y' zu formatieren und so versuchte ich mit dem Code unten

dates = { 
     'dd/mm/yy': "%d/%m/%Y", 
     'mm/dd/yy': "%m/%d/%Y", 
    } 

def return_date_fromat(d, date_format): 
    return datetime.datetime.strptime(d, date_format) 


csv_data["date"] = csv_data["date"].apply(lambda d: return_date_fromat(d, dates['dd/mm/yy'])) 

bas matisch i als return_date_fromat eine andere Funktion für Lambda verwende, weil, wenn ich wie

unter
csv_data["date"] = csv_data["date"].apply(lambda d: datetime.datetime.strptime(d, dates['dd/mm/yy']) 

verwendet i *** NameError: global name 'dates' is not defined bin immer und damit Lambda eine Funktion return_date_fromat für ich bin mit

So endlich, wie das Datum zu formatieren?

Antwort

0

Ich glaube, Sie Parameter parse_dates zu [2] ändern müssen, weil True Mittel DatetimeIndexdocs sehen analysieren:

parse_dates : boolean oder eine Liste von ints oder Namen oder eine Liste von Listen oder dict, Standard Falsch.

Wenn True -> versuchen Sie den Index zu analysieren.
Wenn [1, 2, 3] -> versuchen, die Spalten 1, 2, 3 jeweils als separate Datumsspalte zu analysieren.
Wenn [[1, 3]] -> Spalten 1 und 3 kombinieren und als einzelne Datumsspalte analysieren.
Wenn {'foo': [1, 3]} -> Spalten 1, 3 als Datum analysieren und Ergebnis 'foo' aufrufen. Für ISO8601-formatierte Daten existiert ein Fast-Path.

import pandas as pd 
import numpy as np 
from pandas.compat import StringIO 

temp=u"""country,sale,date,trans_factor 
India,403171,12/01/2012,1 
Bhutan,394096,12/01/2012,2 
Nepal,super,12/01/2012,3 
madhya,355883,12/01/2012,4 
sudan,man,12/01/2012,5""" 
#after testing replace 'StringIO(temp)' to 'filename.csv' 
df = pd.read_csv(StringIO(temp), parse_dates=[2]) 
#df = pd.read_csv(StringIO(temp), parse_dates=['date']) 

print (df) 
    country sale  date trans_factor 
0 India 403171 2012-12-01    1 
1 Bhutan 394096 2012-12-01    2 
2 Nepal super 2012-12-01    3 
3 madhya 355883 2012-12-01    4 
4 sudan  man 2012-12-01    5 

print (df.dtypes) 
country     object 
sale     object 
date   datetime64[ns] 
trans_factor    int64 
dtype: object 

EDIT:

Wenn Bedarf benutzerdefinierte Parser Add Parameter date_parser:

parser = lambda x: pd.datetime.strptime(x, '%d/%m/%Y') 
df = pd.read_csv(StringIO(temp), parse_dates=[2], date_parser=parser) 
print (df) 
    country sale  date trans_factor 
0 India 403171 2012-01-12    1 
1 Bhutan 394096 2012-01-12    2 
2 Nepal super 2012-01-12    3 
3 madhya 355883 2012-01-12    4 
4 sudan  man 2012-01-12    5 

Aber funktioniert auch dayfirst=True:

df = pd.read_csv(StringIO(temp), parse_dates=[2], dayfirst=True) 
print (df) 
    country sale  date trans_factor 
0 India 403171 2012-01-12    1 
1 Bhutan 394096 2012-01-12    2 
2 Nepal super 2012-01-12    3 
3 madhya 355883 2012-01-12    4 
4 sudan  man 2012-01-12    5 
+0

im Grunde bin ich die Reihenfolge der Datumsspalte bekommen dynamisch oder zufällig und so kann ich nicht harter Kern es mit 'parse_dates = [2]', also gibt es irgendwie, es in '% d /% m /% Y' einmal zu ändern, nachdem csv gelesen wurde? –

+0

Ist möglich parse nach Name der Spalte wie 'df = pd.read_csv (StringIO (temp), parse_dates = ['Datum'])'? – jezrael

+0

Nein, wie ich im vorherigen Post gesagt habe, hatte ich diesen Code 'csv_data [Fremdschlüssel.Tabellenspaltenname] = CSV_Daten [Fremdschlüssel.Tabellenspaltenname] .apply ( Lambda d: Rückgabedatum_fromat (d, Daten [Fremdschlüssel.date_format]))) Ich bekomme dynamisch und so muss ich das Format innerhalb der Methode 'return_date_fromat' selbst ändern, wenn es Ihnen nichts ausmacht, war das möglich? –