【问题标题】:Value Error: time data '12:00:01 AM' does not match format '%I:%M:00 %p' using time.strptime值错误:时间数据“12:00:01 AM”与使用 time.strptime 的格式“%I:%M:00 %p”不匹配
【发布时间】:2020-01-09 17:10:09
【问题描述】:

我对 python 有点陌生,因此非常感谢任何帮助。在此先感谢(对于任何错误标签,我们深表歉意)。

我正在处理一个包含日期、时间、CO、CO2 和 CH4 列的 csv 文件。我想要实现的是创建一个循环,以便每次有零秒的时间(例如:“12:00:00 AM”、“3:05:00 PM”等)它都会获取该数据行并将其发送到新的文本或 csv 文件(这部分不包含在代码中)。我使用 pandas 导入了 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' 格式匹配的所有时间数字,但只返回第一个数字。在遇到与指定格式不匹配的第一个数字后,它停止了,这对我来说似乎很奇怪。

【问题讨论】:

  • 最好将TIME 转换为timedelta/timestamp,提取秒数并查找值为0 的秒数。

标签: python pandas dataframe time jupyter-notebook


【解决方案1】:

如果你想跳过错误,那么你应该使用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")

【讨论】:

    【解决方案2】:

    你做的很长。 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 获取日期时间格式说明符

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多