pythondatetypesdataframepandas

Can pandas automatically read dates from a CSV file?


Today I was positively surprised by the fact that while reading data from a data file (for example) pandas is able to recognize types of values:

df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])

For example it can be checked in this way:

for i, r in df.iterrows():
    print type(r['col1']), type(r['col2']), type(r['col3'])

In particular integer, floats and strings were recognized correctly. However, I have a column that has dates in the following format: 2013-6-4. These dates were recognized as strings (not as python date-objects). Is there a way to "learn" pandas to recognized dates?


Solution

  • You should add parse_dates=True, or parse_dates=['column name'] when reading, thats usually enough to magically parse it. But there are always weird formats which need to be defined manually. In such a case you can also add a date parser function, which is the most flexible way possible.

    Suppose you have a column 'datetime' with your string, then:

    from datetime import datetime
    dateparse = lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
    
    df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse)
    

    This way you can even combine multiple columns into a single datetime column, this merges a 'date' and a 'time' column into a single 'datetime' column:

    dateparse = lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
    
    df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)
    

    You can find directives (i.e. the letters to be used for different formats) for strptime and strftime in this page.