python pandas错误地阅读excel日期

时间:2013-04-08 08:33:07

标签: python pandas

我有一个excel文件,日期格式如下:

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

使用pandas的parse方法读取数据后,日期几乎正确读取

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

我需要做什么来a)让它正常工作,或者b)是否有一个技巧可以轻松解决这个问题? (例如某种日期时间的“圆形”功能)

2 个答案:

答案 0 :(得分:2)

Excel使用ddddd.tttttt格式序列化日期时间,其中d部分是一个整数,表示距参考日的偏移量(如1899年12月31日)和t部分是0.01.0之间的分数,代表给定时间的一天中的部分时间(例如,在12:00 0.5,在18:00,0.75等等)。

我请你上传一个包含样本数据的文件。 .xlsx文件实际上是ZIP存档,其中包含XML序列化的工作表。 This are the dates我从相关专栏中提取。摘录:

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)

答案 1 :(得分:1)

我遇到了同样的问题,并且没有使用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)

注意:这会忽略小时级以下的任何时间粒度,但这只是我需要的,而且从您的示例中可以看出这也是您的情况。