ValueError:未转换的数据保留在Pandas DataFrame上

时间:2014-03-18 21:20:11

标签: python pandas

数据 - 这是我在Pandas DataFrame中的数据

CallDateAndTimeStart
01/01/2010 00:26:28.003613 MST
01/01/2010 00:28:54.230713 MST
01/02/2008 14:12:11 MST
05/19/2010 09:12:32.080728 MST

我尝试将列dtype更改为datetime64 [ns]

df['CallDateAndTimeStart'] = pandas.to_datetime(df['CallDateAndTimeStart'],
    format='%m/%d/%Y %H:%M:%S')

错误消息 - 如果不清除数据,我会收到以下错误:

File "C:\Python27\lib\site-packages\pandas\tseries\tools.py", line 308, in _convert_listlike raise e
ValueError: unconverted data remains: .003613 MST

问题

如何更正我的dataframe列以便它可以转换为日期时间类型?我发布了我的答案,但有更好的答案吗?感谢。

3 个答案:

答案 0 :(得分:1)

<强>代码

我在DataFrame列(convert_time)上应用自定义函数

df['CallDateAndTimeStart'] = df['CallDateAndTimeStart'].apply(convert_time)

def convert_time(mytime):
""" Fix DateTime by removing details after . and timezones """

    # Remove on period and after
    try:
        mytime = str(mytime).split(".")[0]
    except ValueError:
        print "Not able to split ."

    # Remove Timeframe (E.g. MST)
    mytime = str(mytime).split(" ")[0] + " " + str(mytime).split(" ")[1]

return mytime

df['CallDateAndTimeStart'] = pandas.to_datetime(df['CallDateAndTimeStart'],
    format='%m/%d/%Y %H:%M:%S')

<强>输出

CallDateAndTimeStart
2010-01-01 00:26:28
2010-01-01 00:28:54
2010-05-19 09:12:32
2008-01-02 14:12:11
2010-01-01 00:39:41

答案 1 :(得分:1)

我遇到了同样的问题,我使用了和你一样的方法来解决它。(应用一个函数来删除不必要的数据)

我猜你可以使用标准界面来避免这个问题:

>>> now = time.time() # get current time in second
>>> now_format = time.ctime(now) # get formatted time, like 'Thu May 21 17:43:46 2015'

然后使用time.strptime()获取标准时间结构:

>>> standard_time_struct = time.strptime(now_format,"%a %B %d %X %Y")

你可以得到这样的最终结果:

>>> standard_time_struct
>>> time.struct_time(tm_year=2015, tm_mon=5, tm_mday=21, tm_hour=17, tm_min=49, tm_sec=10, tm_wday=3, tm_yday=141, tm_isdst=-1)

答案 2 :(得分:1)

由于未定义微秒和时区的格式,因此收到错误消息。

如果所有行的格式都相同,则正确的格式应为:

df['CallDateAndTimeStart'] = pandas.to_datetime(df['CallDateAndTimeStart'],
format='%m/%d/%Y %H:%M:%S.%f %Z') 

由于并非所有行的格式都相同,所以最好的方法是让熊猫在不声明格式的情况下推断格式:

df['CallDateAndTimeStart'] = pandas.to_datetime(df['CallDateAndTimeStart'])

输出:

        CallDateAndTimeStart
0 2010-01-01 00:26:28.003613
1 2010-01-01 00:28:54.230713
2 2008-01-02 14:12:11.000000
3 2010-05-19 09:12:32.080728

请注意,在此解决方案中,由于无法识别MST,因此忽略了时区,但是您可以使用tz_convert将datetime对象转换为正确的时区。 另外,如果您对微秒不感兴趣,那么一旦它成为日期时间对象,就可以轻松舍入它:

df['CallDateAndTimeStartRounded'] = df['CallDateAndTimeStart'].dt.floor('s')

输出:

        CallDateAndTimeStart CallDateAndTimeStartRounded
0 2010-01-01 00:26:28.003613         2010-01-01 00:26:28
1 2010-01-01 00:28:54.230713         2010-01-01 00:28:54
2 2008-01-02 14:12:11.000000         2008-01-02 14:12:11
3 2010-05-19 09:12:32.080728         2010-05-19 09:12:32