pd.to_datetime或parse datetimes无法处理我的csv文件(格式:dd/mm/yyyy,hh:mm:ss)

3
我从csv文件中提取了以下表格。
Date,Time,CO2(ppm),CellTemp(c),CellPres(kPa)  
10/08/2016,13:21:11,356.89,51.07,99.91  
10/08/2016,13:21:12,356.89,51.07,99.91  
10/08/2016,13:21:13,356.83,51.07,99.91

我最近研究了几天,尝试了不同的方法使得Pandas能够读取DateTime列并将其转换为datetime类型,但一直没有成功。以下是我尝试的一些方法:

df = pd.read_csv(myfile)
print(df.dtypes)

我理解的是:

Date             object  
Time             object  
CO2(ppm)         object  
CellTemp(c)      object  
CellPres(kPa)    object  
dtype: object

当我尝试执行以下操作:
df_2 = pd.read_csv(file, parse_dates=[['Date', 'Time']]) 
print(df_2.dtypes)

我明白了

Date_Time        object  
CO2(ppm)         object  
CellTemp(c)      object  
CellPres(kPa)    object  
dtype: object

现在,DateTime已经合并到一列中(11/08/2016 14:06:18)(这正是我想要的),但没有被识别为datetime

然后我尝试:

pd.to_datetime(df_2['Date_Time'], format='%d/%m/%Y %H:%M:%S)

我得到了一个错误信息:
File "<ipython-input-31-ace4ed1a0aa9>", line 1
pd.to_datetime(df_2['Date_Time'],format='%d/%m/%Y %H:%M:%S                                                            
SyntaxError: EOL while scanning string literal

当我尝试时:

import dateutil.parser
dateutil.parser.parse(df_2['Date_Time'])

除了一些其他输出之外,我收到以下错误消息:

AttributeError: 'Series' object has no attribute 'read'

我也在Excel中手动将日期格式更改为yyyy-mm-dd,并尝试了相同的事情,但没有任何更好的结果。我觉得这一定是我犯的一个非常基本的错误,我对脚本编写还很新,并希望得到任何帮助。如果我的问题有格式错误,请谅解我,我真的很努力。


你会得到 SyntaxError: EOL while scanning string literal 错误,因为你在 format='%d/%m/%Y %H:%M:%S) 中忘记了一个闭合单引号。 - Khris
现在我收到了一个 ValueError 错误:时间数据 '10/08/2016 2016-08-10 at 13:37' 与格式 '%d/%m/%Y %H:%M:%S' 不匹配。 :( - vera
df_2=pd.read_csv(file,parse_dates=[['Date','Time']]) 对于您的有限样本数据有效,您可能在df中有一些错误的数据,我建议像第一个片段中那样加载df df=pd.read_csv(myfile),然后执行 df['Date_Time'] = pd.to_datetime(df[['Date','Time']].apply(lambda x: ' '.join(x), axis=1), errors='coerce') 这将强制任何错误的数据转换为“NaT”,您可以使用“dropna”过滤掉这些数据。 - EdChum
1个回答

4

看起来存在一些错误的日期时间或者某些值无法转换为日期时间,因此您可以在使用to_datetime进行转换时添加参数errors='coerce',将它们转换为NaT

#31.11. does not exist
print (df_2)
             Date_Time  CO2(ppm)  CellTemp(c)  CellPres(kPa)  
0  10/08/2016 13:21:11    356.89        51.07            99.91
1  10/08/2016 13:21:12    356.89        51.07            99.91
2  31/11/2016 13:21:13    356.83        51.07            99.91

df_2['Date_Time'] = pd.to_datetime(df_2['Date_Time'],
                                   format='%d/%m/%Y %H:%M:%S',
                                   errors='coerce')
print (df_2)
            Date_Time  CO2(ppm)  CellTemp(c)  CellPres(kPa)  
0 2016-08-10 13:21:11    356.89        51.07            99.91
1 2016-08-10 13:21:12    356.89        51.07            99.91
2                 NaT    356.83        51.07            99.91

您可以通过以下方式检查所有有问题的值:

print (df_2[pd.to_datetime(df_2['Date_Time'],format='%d/%m/%Y %H:%M:%S', errors='coerce').isnull()])
             Date_Time  CO2(ppm)  CellTemp(c)  CellPres(kPa)  
2  31/11/2016 13:21:13    356.83        51.07            99.91

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接