值错误:时间数据'12:00:01 AM'与使用time.strptime的格式'%I:%M:00%p'不匹配

时间:2019-09-06 20:59:14

标签: python pandas dataframe time jupyter-notebook

我对python有点陌生,因此非常感谢您的帮助。在此先感谢您(并感谢您贴错标签)。

我正在处理一个csv文件,其中包含带有日期,时间,CO,CO2和CH4的列。我要实现的是做一个循环,以便每次有零秒的时间(例如:“ 12:00:00 AM”,“ 3:05:00 PM”等)都将获取该数据行并将其发送到新的文本或csv文件(此部分未包含在代码中)。我使用熊猫导入了csv,并使用time.strptime将字符串转换为可读的时间格式。

不幸的是,由于缺少一些数据,因此我无法进行循环以收集每60个数据。我也尝试过使用strptime创建函数,但是它也给我一个类型错误,指出它必须是字符串,而不是熊猫核心系列。

导入csv文件:

data1 = pd.read_csv("prueba1.csv")
print(data1)

输出为:

         DATE         TIME     CO  CO2_dry  CH4_dry
0    3/4/2019  12:00:00 AM  0.352      420     1.99
1    3/4/2019  12:00:01 AM  0.352      420     1.99
2    3/4/2019  12:00:02 AM  0.352      420     1.99
3    3/4/2019  12:00:03 AM  0.366      420     1.99
4    3/4/2019  12:00:04 AM  0.366      420     1.99
5    3/4/2019  12:00:05 AM  0.366      421     1.99
6    3/4/2019  12:00:06 AM  0.369      421     1.99
7    3/4/2019  12:00:07 AM  0.369      421     1.99
8    3/4/2019  12:00:09 AM  0.354      421     1.99
9    3/4/2019  12:00:10 AM  0.354      421     1.99

我正在使用的代码是

for i in data1["TIME"]:
        time.strptime(i,"%I:%M:%S %p")
        if time.strptime(i,"%I:%M:%S %p") == time.strptime(i,"%I:%M:00 %p"):
            print("Found a number!", i)
        else:
            print("Yikes")

错误消息是:

Found a number! 12:00:00 AM

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-18-8b936d17df46> in <module>()
      2         time.strptime(i,"%I:%M:%S %p")
      3         #print(i)
----> 4         if time.strptime(i,"%I:%M:%S %p") == time.strptime(i,"%I:%M:00 %p"):
      5             print("Found a number!", i)
      6         else:

C:\Users\Diego\Anaconda3\lib\_strptime.py in _strptime_time(data_string, format)
    557     """Return a time struct based on the input string and the
    558     format string."""
--> 559     tt = _strptime(data_string, format)[0]
    560     return time.struct_time(tt[:time._STRUCT_TM_ITEMS])
    561 

C:\Users\Diego\Anaconda3\lib\_strptime.py in _strptime(data_string, format)
    360     if not found:
    361         raise ValueError("time data %r does not match format %r" %
--> 362                          (data_string, format))
    363     if len(data_string) != found.end():
    364         raise ValueError("unconverted data remains: %s" %

ValueError: time data '12:00:01 AM' does not match format '%I:%M:00 %p'

它返回前面的输出。我希望它返回所有与'%I:%M:00%p'格式匹配的时间数字,但只返回第一个数字。我觉得奇怪的是,它遇到第一个与指定格式不匹配的数字后就停止了运行。

2 个答案:

答案 0 :(得分:0)

如果要跳过错误,则应使用tryexcept

for i in data1["TIME"]:
        try:
           time.strptime(i,"%I:%M:%S %p")
           if time.strptime(i,"%I:%M:%S %p") == time.strptime(i,"%I:%M:00 %p"):
              print("Found a number!", i)
           else:
              print("Yikes")
        except ValueError:
              print("Ouch! Something failed")

答案 1 :(得分:0)

您正在做的很长的路要走。 pd.to_datetime既方便又快捷:

df['DATE'] = pd.to_datetime(df['DATE'])
df['TIME'] = pd.to_datetime(df['TIME']).dt.time

如果您的情况需要精确的格式,

df['DATE'] = pd.to_datetime(df['DATE'], format='%m/%d/%Y')
df['TIME'] = pd.to_datetime(df['TIME'], format='%I:%M:%S %p').dt.time

您可以从strftime.org

获取日期时间格式说明符