当我尝试使用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'
是错误还是预期的行为?
答案 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')