值错误:Pandas DataFram上仍保留未转换的数据

2024-10-01 13:44:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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]

^{pr2}$

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

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

问题

如何更正dataframe列以便它可以转换为datetime类型?我贴出了我的答案,但是还有更好的答案吗?谢谢。在


Tags: 数据答案消息pandaslib错误filepython27
3条回答

编码

我在DataFrame列上应用了一个自定义函数(convert\u 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')

输出

^{pr2}$

我遇到了同样的问题,我用了和你一样的方法来解决它

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

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

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

^{pr2}$

最终结果如下:

>>> 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)

您收到一个错误,因为您没有定义微秒和时区的格式。在

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

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

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

^{pr2}$

输出:

        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对象转换为正确的时区。 另外,如果您对微秒不感兴趣,那么一旦它是一个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

相关问题 更多 >