关于python处理作Excel文件的一些问题,包括时间处理 (转)
来源:互联网 发布:mac 安装多个xcode 编辑:程序博客网 时间:2024/05/13 06:39
关于python处理作Excel文件的一些问题,包括时间处理(原创)
根据limodou的《使用xlrd模块时对Excel的日期处理》可以处理年月日,但时分秒没法处理。下面是他的原文: 最近在我正在开发的一个数据维护工具中我经常使用 xlrd 来读取Excel文件,在转换过 程中一直也没有遇到什么问题,只不过需要注意,它返回的字符串都是 Unicode 编码。不过今天在使用时发现对于日期类型,在Excel文件中看到的可能是 "2005-7-8" 这样格式,但直接使用 xlrd 来读的话却会变成 38541。很奇怪。仔细查看 Excel 后再经过试验,我明白了 Excel 保存日期其实是使用一个长整数,只不过显示时可以为标准的日期格式。本来我想将日期在 Excel 中直接转为日期格式的字符串,但没整出来,而且我更希望有一种方法可以正确地进行转换。于是我想 xlrd 有没有这样的处理呢?使用 NewEdit 的 代码提示功能,查了查 xlrd 模块的属**,没找到。不过看到它有cell_type(i, j)的方法可以返回一个单元格的数据格式。于是我使用这个方法打出日期所在的单元格的格式为:3。然后又比较了 xlrd 中定义的一些常量,最后锁定在了 XL_CELL_DATE上,它的值就是 3。这样到目前为止我已经知道了如何判断一个单元格是否是日期类型,下面就是如何转换了。 我查阅了datetime 模式,在它的date类中查到一个函数叫: fromordinal(oridnal) 它的作用是将从公元1年1月1日开始的天数转换为年月日的形式。于是我试了一下: >>> import datetime 好象不对呀。于是我反向转转试试: >>> datetime.date.toordinal(datetime.date(2005, 7, 8)) 怎么这么大的数。后来我想到可能fromordinal与Excel使用的起始日期可能是不同的。做个减法看一看是哪天。 >>> datetime.date.fromordinal(732135 - 38541 + 1) 原来如此,是 1899/12/31 日,这回我明白了。其实象用过的 Informix 中的日期与 Excel 的方法是一样的,都是从 1899/12/31 开始计算的。那么做个转换函数吧: __s_date = datetime.date(1899, 12, 31).toordinal() - 1 上述函数就是用来将一个从 1899/12/31 开始计算的天数转成年月日的格式,并且是字符串的形式。其中如果传入的是一个浮点数,先取整再进行转换。 Trackback: http://tb.donews.net/TrackBack.aspx?PostId=459100
=======================================================
>>> datetime.date.fromordinal(38541)
datetime.date(106, 7, 10)
732135
datetime.date(1899, 12, 31)
def getdate(date):
if isinstance(date, float):
date = int(date)
d = datetime.date.fromordinal(__s_date + date)
return d.strftime("%Y-%m-%d")
现在要处理时分秒怎么办呢??使用下面的方法:
import datetime
from matplotlib.dates import num2date
def ReDate(date):
__startDt = datetime.date(1899, 12, 31).toordinal() - 1
if type(date)==float:
return num2date(__startDt+date).strftime("%Y-%m-%d %H:%M:%S")
s = 39469.912437
print ReDate(s)
大家来看一下from matplotlib.dates import num2date他的一些代码:
def _from_ordinalf(x, tz=None):
"""
convert Gregorian float of the date, preserving hours, minutes,
seconds and microseconds. return value is a datetime
"""
if tz is None: tz = _get_rc_timezone()
ix = int(x)
dt = datetime.datetime.fromordinal(ix)
remainder = float(x) - ix
hour, remainder = divmod(24*remainder, 1)
minute, remainder = divmod(60*remainder, 1)
second, remainder = divmod(60*remainder, 1)
microsecond = int(1e6*remainder)
if microsecond<10: microsecond=0 # compensate for rounding errors
dt = datetime.datetime(
dt.year, dt.month, dt.day, int(hour), int(minute), int(second),
microsecond, tzinfo=UTC).astimezone(tz)
if microsecond>999990: # compensate for rounding errors
dt += datetime.timedelta(microseconds=1e6-microsecond)
return dt
- 关于python处理作Excel文件的一些问题,包括时间处理 (转)
- 关于python处理作Excel文件的一些问题,包括时间处理 (转)
- python操作处理Excel文件(转)
- 关于FastJson的一些问题的处理(时间问题 ,转换json重用对象引用问)
- 关于Java(JavaScript)判断处理时间的问题(包括月份,年,天等相关的差)
- Python处理Excel文件
- Python 处理excel文件
- python处理Excel文件
- python处理excel表格的一些基本操作(1)
- python wget下载文件处理的一些问题
- 关于时间格式的一些处理方法
- Oracle中关于时间的一些处理
- python-时间处理问题
- python对CSV、Excel文件的处理
- 处理一些时间问题的小结
- python中关于时间的处理
- python中关于时间变量的处理
- Python中关于时间处理的方法
- linux 查看文件夹大小
- 绝对元素的对齐与偏移
- mysql字符集设置和查询问题(转)
- 关于python处理作Excel文件的一些问题,包括时间处理 (转)
- rac相关参数
- 关于python处理作Excel文件的一些问题,包括时间处理 (转)
- 在安装SQL SERVER 2000时出现如下的提示:“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机。”
- 并发编程利器Eventlet
- 最簡單的rsync配置方法
- MySQL EVENT
- python中如何判断一个变量的数据类型?(原创)
- 为过程或函数 ** 指定了过多的参数
- 在Eclipse中 把Java 工程即普通工程 转换成 web 工程的方法
- “有道难题2010网易编程挑战赛”http://www.youdao.com/nanti/index.html