Python pandas错误地读取Excel日期

4

我有一个Excel文件,其中日期格式如下:

22.10.07 16:00
22.10.07 17:00
22.10.07 18:00
22.10.07 19:00

使用pandas的解析方法读取数据后,日期被 几乎 正确地读入:

In [55]: nts.data['Tid'][10000:10005]
Out[55]:
10000    2007-10-22 15:59:59.997905
10001    2007-10-22 16:59:59.997904
10002    2007-10-22 17:59:59.997904
10003    2007-10-22 18:59:59.997904

我需要怎样做才能使其正常运行呢?或者有什么技巧可以轻松解决这个问题吗?(例如一些用于 datetime 的“round”函数)


当前修复:创建一个新的时间向量:time = [t0 + dt.timedelta(hours=i) for i in range(len(nts.data))] - John
你能把Excel文件(至少是相关记录,也许模糊或删除列)放到网上吗? - Raffaele
Raffaele,这是一个示例 https://dl.dropbox.com/u/18478297/dummydata.xlsx - John
2个回答

3

我也遇到了相同的问题,通过不使用Pandas解析日期,而是将自己的函数(如下所示)应用于数据框的相关列来解决了它:

def ExcelDateToDateTime(xlDate):
    epoch = dt.datetime(1899, 12, 30)
    delta = dt.timedelta(hours = round(xlDate*24))
    return epoch + delta

df = pd.DataFrame.from_csv('path')

df['Date'] = df['Date'].apply(ExcelDateToDateTime)

注意:这将忽略小时级别以下的任何时间粒度,但这就是我所需要的,从您的示例看,这也可能是您的情况。

2

Excel使用“ddddd.tttttt”格式对日期时间进行序列化,其中“d”部分是代表偏移量的整数,该偏移量是相对于参考日期(例如1899年12月31日)的。而“t”部分是介于0.0和1.0之间的分数,表示给定时间的一天中的部分(例如在12:00时是0.5,在18:00时是0.75等)。

我要求您上传一个包含样本数据的文件。“.xlsx”文件实际上是ZIP存档文件,其中包含XML序列化的工作表。这些是我从相关列中提取的日期。摘录如下:

38961.666666666628
38961.708333333292
38961.749999999956

当您尝试手动反序列化时,您会得到与Panda相同的日期时间。不幸的是,Excel存储时间的方式使得无法精确表示某些值,因此必须将它们舍入以便于显示。我不确定分析是否需要舍入后的数据。
以下是我用来测试反序列化的日期时间是否与Panda相同的脚本:
from datetime import date, datetime, time, timedelta
from urllib2 import urlopen

def deserialize(text):
  tokens = text.split(".")
  date_tok = tokens[0]
  time_tok = tokens[1] if len(tokens) == 2 else "0"
  d = date(1899, 12, 31) + timedelta(int(date_tok))
  t = time(*helper(float("0." + time_tok), (24, 60, 60, 1000000)))
  return datetime.combine(d, t)

def helper(factor, units):
  result = list()
  for unit  in units:
    value, factor = divmod(factor * unit, 1)
    result.append(int(value))
  return result

url = "https://gist.github.com/RaffaeleSgarro/877d7449bd19722b44cb/raw/" \
      "45d5f0b339d4abf3359fe673fcd2976374ed61b8/dates.txt"

for line in urlopen(url):
  print deserialize(line)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接