数据 - 这是我在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列以便它可以转换为日期时间类型?我发布了我的答案,但有更好的答案吗?感谢。
答案 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