Leave dates as strings using read_excel function from pandas in python
Question: **Python 2.7.10**  
**Tried pandas 0.17.1 -- function read_excel**  
**Tried pyexcel 0.1.7 + pyexcel-xlsx 0.0.7 -- function get_records()**

When using pandas in Python is it possible to read excel files (formats:
_xls|xlsx_) and leave columns containing **date** or **date + time** values as
**strings** rather than **_auto-converting_** to `datetime.datetime` or
`timestamp` types?

If this is not possible using pandas can someone suggest an alternate
method/library to read _xls|xlsx_ files and leave date column values as
strings?

For the **pandas** solution attempts the `df.info()` and resultant date column
types are shown below:

    
    
    >>> df.info()
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 117 entries, 0 to 116
    Columns: 176 entries, Mine to Index
    dtypes: datetime64[ns](2), float64(145), int64(26), object(3)
    memory usage: 161.8+ KB
    >>> type(df['Start Date'][0])
    Out[6]: pandas.tslib.Timestamp
    >>> type(df['End Date'][0])
    Out[7]: pandas.tslib.Timestamp
    

**Attempt/Approach 1:**

    
    
    def read_as_dataframe(filename, ext):
       import pandas as pd
       if ext in ('xls', 'xlsx'):
          # problem: date columns auto converted to datetime.datetime or timestamp!
          df = pd.read_excel(filename) # unwanted - date columns converted!
    
       return df, name, ext
    

**Attempt/Approach 2:**

    
    
    import pandas as pd
    # import datetime as datetime
    # parse_date = lambda x: datetime.strptime(x, '%Y%m%d %H')
    parse_date = lambda x: x
    elif ext in ('xls', 'xlsx', ):
        df = pd.read_excel(filename, parse_dates=False)
        date_cols = [df.columns.get_loc(c) for c in df.columns if c in ('Start Date', 'End Date')]
        # problem: date columns auto converted to datetime.datetime or timestamp!
        df = pd.read_excel(filename, parse_dates=date_cols, date_parser=parse_date)
    

And have also tried pyexcel library but it does the same auto-magic convert
behavior:

**Attempt/Approach 3:**

    
    
    import pyexcel as pe
    import pyexcel.ext.xls
    import pyexcel.ext.xlsx
    
    t0 = time.time()
    if ext == 'xlsx':
        records = pe.get_records(file_name=filename)
        for record in records:
            print("start date = %s (type=%s), end date = %s (type=%s)" %
                  (record['Start Date'],
                   str(type(record['Start Date'])),
                   record['End Date'],
                   str(type(record['End Date'])))
                  )
    


Answer: For attempt 3, you could have added a few formatting lines which [pyexcel
offers](http://pyexcel.readthedocs.org/en/latest/tutorial03.html#convert-a-
column-of-numbers-to-strings):

    
    
    import pyexcel as pe
    import pyexcel.ext.xlsx
    
    t0 = time.time()
    if ext == 'xlsx':
        sheet = pe.get_sheet(file_name=filename) # <<-- difference starts here
        sheet.name_columns_by_row(0)  # so that 'Start Date' refers the whole column
        sheet.column.format('Start Date', lambda d: d.isoformat()) # format it
        sheet.column.format('End Date', lambda d: d.isoformat())
        records = sheet.to_records() # then get the records out <<-- ends here
        for record in records:
            print("start date = %s (type=%s), end date = %s (type=%s)" %
                  (record['Start Date'],
                   str(type(record['Start Date'])),
                   record['End Date'],
                   str(type(record['End Date'])))
                  )
    

