使用python

时间:2015-12-08 13:13:28

标签: python excel datetime pandas

Python 2.7.10
尝试过的pandas 0.17.1 - 函数read_excel
尝试过pyexcel 0.1.7 + pyexcel-xlsx 0.0.7 - 函数get_records()

在Python中使用pandas时,可以读取excel文件(格式: xls | xlsx )并保留包含日期日期+时间值为字符串而不是 自动转换 datetime.datetimetimestamp类型?

如果使用pandas无法做到这一点,有人会建议使用备用方法/库来读取 xls | xlsx 文件并将日期列值保留为字符串吗?

对于 pandas 解决方案,尝试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:

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

尝试/接近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'])))
              )

3 个答案:

答案 0 :(得分:1)

  • 在pandas.read_excel中使用转换器{&#39; Date&#39;:str}选项有帮助。 pandas.read_excel(xlsx, sheet, converters={'Date': str})
  • 您可以尝试将时间戳转换回原始格式
    df['Date'][0].strftime('%Y/%m/%d')

答案 1 :(得分:1)

我遇到了一个相同的问题,除了pandas奇怪地将一些单元格转换为日期时间。我最终手动将每个单元格转换为字符串,如下所示:

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)

答案 2 :(得分:0)

我尝试(手动)saving the file in a CSV UTF-8 format,并使用pd.read_csv()并运行良好。

我尝试了很多方法来用read_excel处理同一件事。没有为我工作。因此,我猜测read_excel可能正在更新您无法控制的datetime对象中的字符串。