2015-12-08 41 views
1

的Python 2.7.10
串试图大熊猫0.17.1 - 功能read_excel
试图pyexcel 0.1.7 + pyexcel,XLSX 0.0.7 - 功能get_records()休假日期为利用熊猫read_excel功能蟒蛇

当使用Python大熊猫是它可以读取Excel文件(格式:XLS | XLSX),并留下含有日期日期+时间列值为字符串而不是自动转换datetime.datetimetimestamp类型?

如果这是不可能的使用熊猫可以有人建议一个替代方法/库xls | xlsx文件并保留日期列值为字符串?

对于大熊猫溶液将尝试df.info()和所得日期列类型如下所示:

>>> 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 

尝试/方法1:

尝试/方法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) 

,也有试过pyexcel库,但它同样的自动魔法转换行为:

尝试/方法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']))) 
      ) 
+0

我不明白你的问题,如果你不通过'date_cols'或'date_parser'那么就不会尝试解析日期字符串 – EdChum

+0

正如你可以从我的代码片断看到的,我没有通过date_cols或date_parser上面的第一种风格的方法和熊猫自动神奇地(和无声地)将列转换为** datetime **值。我需要找到一种方法来阻止它,并将包含日期值的任何列作为字符串保留。 – MattB

+0

您确定,请在运行您的代码后发布'df.info()' – EdChum

回答

1
  • 使用转换器{ '日期':STR}选项在pandas.read_excel里面有帮助。 pandas.read_excel(xlsx, sheet, converters={'Date': str})
  • 你可以尝试转换您的时间戳回原来的格式
    df['Date'][0].strftime('%Y/%m/%d')
1

我遇到了一个相同的问题,除了大熊猫是奇怪的转换只一些细胞成日期时间。我结束了每个单元手动转换成字符串,像这样:

def undate(x): 
    if pd.isnull(x): 
     return x 
    try: 
     return x.strftime('%d/%m/%Y') 
    except AttributeError: 
     return x 
    except Exception: 
     raise 

for i in list_of_possible_date_columns: 
    df[i] = df[i].apply(undate)