【发布时间】: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)并保留包含 date 或 date + time 的列strong> 值作为 字符串 而不是 自动转换 到 datetime.datetime 或 timestamp 类型?
如果使用 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_cols或date_parser那么它不会尝试解析日期字符串 -
从我的代码 sn-ps 中可以看出,我没有将 date_cols 或 date_parser 传递给上面的第一种样式方法,pandas 会自动(并且无声地)将列转换为 datetime 价值观。我需要找到一种方法来阻止它并将包含日期值的任何列保留为字符串。
-
您确定吗,请在运行代码后发布
df.info() -
感谢@EdChum 将进一步探索 csv 方法。电子表格本身是我无法控制的(格式 + 内容),因此我需要使用提供给我的格式,并且我正在尝试开发一种强大的自定义方法来尝试不同的日期格式(时区)并为用户提供最合适的选择。
-
我认为@EdChum 是正确的。您获得的类型取决于数据在 excel 文件本身中的输入方式。如果该列在此处格式化为日期时间数据,您将从
read_excel获取日期时间数据。
标签: python excel datetime pandas