解析unix时间戳的精确度只有几分之一秒

时间:2014-02-28 15:03:08

标签: python pandas

当我尝试使用unix时间戳读取.csv文件名时,它看起来像 我以前用于转换的列被视为字符串。它导致精度下降。 经过几次实验,我得到了:

>>> import pandas as pd   
>>> import datetime as dt                           
>>> from StringIO import StringIO    
>>> 
>>> input1 = StringIO('unix_timestamp\n1388518220.9870002')
>>> input2 = StringIO('another_col,unix_timestamp\n0,1388518220.9870002')
>>> input3 = StringIO('unix_timestamp,another_col\n1388518220.9870002,0')
>>> 
>>> pd.read_csv(input1, usecols=['unix_timestamp'], date_parser=lambda x: dt.datetime.fromtimestamp(float(x)), parse_dates={'parsed_unix_timestamp':['unix_timestamp']})

       parsed_unix_timestamp
0 2013-12-31 20:30:20.987000    
[1 rows x 1 columns]

>>> pd.read_csv(input2, usecols=['unix_timestamp'], date_parser=lambda x: dt.datetime.fromtimestamp(float(x)), parse_dates={'parsed_unix_timestamp':['unix_timestamp']})

       parsed_unix_timestamp
0 2013-12-31 20:30:20.990000    
[1 rows x 1 columns]

>>> pd.read_csv(input3, usecols=['unix_timestamp'], date_parser=lambda x: dt.datetime.fromtimestamp(float(x)), parse_dates={'parsed_unix_timestamp':['unix_timestamp']})

       parsed_unix_timestamp
0 2013-12-31 20:30:20.987000
[1 rows x 1 columns]

>>> pd.__version__
'0.13.1'

在处理数据类型时,列顺序看起来有所不同。

>>> str(1388518220.9870002)
>>> '1388518220.99'

是错误还是预期的行为?

2 个答案:

答案 0 :(得分:3)

你对浮动的召唤导致了这一点,而不是更好地用

来阅读它
dtype={'unix_timestamp' : object}

然后

df['unix_timestamp'] = pd.to_datetime(df['unix_timestamp'],unit='s')

如果您只是以浮动方式(默认值)读取它,可能也可以工作。我认为他们的精确度足够了。但绝对可以转换。

答案 1 :(得分:-1)

这是预期的行为。阅读Floating Point Arithmetic: Issues and Limitations

也许decimal module可以帮到你:

>>> Decimal('1388518220.9870002') + Decimal('100000000000000.0000000001')
Decimal('100001388518220.9870002001')