我有一个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)是否有一个技巧可以轻松解决这个问题? (例如某种日期时间的“圆形”功能)
答案 0 :(得分:2)
Excel使用ddddd.tttttt
格式序列化日期时间,其中d
部分是一个整数,表示距参考日的偏移量(如1899年12月31日)和t
部分是0.0
和1.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)
注意:这会忽略小时级以下的任何时间粒度,但这只是我需要的,而且从您的示例中可以看出这也是您的情况。