4

我有一个日期格式如下的 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)有什么技巧可以轻松解决这个问题吗?(例如,某种日期时间的“圆形”功能)

4

2 回答 2

2

Excel 使用一种ddddd.tttttt格式序列化日期时间,其中d部分是一个整数,表示与参考日期(如 1899 年 12 月 31 日)的偏移量,t部分是介于两者之间的分数0.01.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)
于 2013-04-08T16:48:53.977 回答
2

我遇到了同样的问题并通过不使用 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)

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

于 2014-06-06T16:48:43.253 回答