使用 python 中 pandas 的 read_excel 函数将日期保留为字符串

Posted

技术标签:

【中文标题】使用 python 中 pandas 的 read_excel 函数将日期保留为字符串【英文标题】:Leave dates as strings using read_excel function from pandas in python 【发布时间】:2016-03-13 10:17:21 【问题描述】:

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)并保留包含 datedate + time 的列strong> 值作为 字符串 而不是 自动转换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'])))
              )

【问题讨论】:

我不明白你的问题,如果你不通过date_colsdate_parser 那么它不会尝试解析日期字符串 从我的代码 sn-ps 中可以看出,我没有将 date_cols 或 date_parser 传递给上面的第一种样式方法,pandas 会自动(并且无声地)将列转换为 datetime 价值观。我需要找到一种方法来阻止它并将包含日期值的任何列保留为字符串。 您确定吗,请在运行代码后发布df.info() 感谢@EdChum 将进一步探索 csv 方法。电子表格本身是我无法控制的(格式 + 内容),因此我需要使用提供给我的格式,并且我正在尝试开发一种强大的自定义方法来尝试不同的日期格式(时区)并为用户提供最合适的选择。 我认为@EdChum 是正确的。您获得的类型取决于数据在 excel 文件本身中的输入方式。如果该列在此处格式化为日期时间数据,您将从read_excel 获取日期时间数据。 【参考方案1】: 在 pandas.read_excel 中使用转换器'Date': str 选项会有所帮助。 pandas.read_excel(xlsx, sheet, converters='Date': str) 您可以尝试将时间戳转换回原始格式df['Date'][0].strftime('%Y/%m/%d')

【讨论】:

【参考方案2】:

我遇到了同样的问题,除了 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)

【讨论】:

【参考方案3】:

我尝试了saving the file in a CSV UTF-8 format(手动)并使用了pd.read_csv()并且工作正常。

我尝试了很多方法来用read_excel 解决同样的问题。没有为我工作。所以,我猜read_excel 可能正在更新您无法控制的日期时间对象中的字符串。

【讨论】:

我明白他为什么不接受这个作为答案,但这对我有用,而且真的很容易。我不认为 pandas 允许的另一种方法对我来说很奇怪【参考方案4】:

我在从 Excel 中提取日期时遇到了同样的问题。我的列有 MM/DD/YYYY 格式,但是在 Pyhton 中读取它并转换为 CSV 格式然后转换为 MM/DD/YYYY 00:00:00 . 幸运的是想出了一个解决方案。使用

excel = pd.read_excel(file, dtype=object)

而不是

excel = pd.read_excel(file, dtype=str)

工作。

我不知道为什么,希望有经验的 python 程序员解释一下。

【讨论】:

为了使它成为一个有用的答案,您能否添加更多细节?对于哪个特定的输入(excel 文件),这会给出所需的输出?

以上是关于使用 python 中 pandas 的 read_excel 函数将日期保留为字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas 中的引擎 read_csv

Python Pandas——Read_csv详解

在 Python Pandas 中使用多个字符分隔符 read_csv

在 Python Pandas 中使用 read_parquet 从 AWS S3 读取镶木地板文件时出现分段错误

Pandas 使用 read_sql_table 的内存过多

python pandas 中文件的读写——read_csv()读取文件