ValueError:时间数据'2006年10月11日24:00'与格式'%d /%m /%Y%H:%M'

时间:2018-10-07 12:48:30

标签: python pandas datetime

我尝试过:

df["datetime_obj"] = df["datetime"].apply(lambda dt: datetime.strptime(dt, "%d/%m/%Y %H:%M"))

但出现此错误:

  

ValueError:时间数据“ 2006年10月11日24:00”与格式不匹配   '%d /%m /%Y%H:%M'

如何正确解决?

3 个答案:

答案 0 :(得分:1)

之所以不起作用,是因为%H参数仅接受0023(包括两者)范围内的值。因此,这意味着24:00是-如错误所示-不是有效的时间字符串。

因此,我认为除了将字符串转换为有效格式外,我们没有其他选择。为此,我们可以先将24:00替换为00:00,然后再增加这些时间戳的日期。

赞:

from datetime import timedelta
import pandas as pd

df['datetime_zero'] = df['datetime'].str.replace('24:00', '0:00')
df['datetime_er'] = pd.to_datetime(df['datetime_zero'], format='%d/%m/%Y %H:%M')
selrow = df['datetime'].str.contains('24:00')
df['datetime_obj'] = df['datetime_er'] + selrow * timedelta(days=1)

因此,最后一行将一天添加到包含24:00的行中,以使'10/11/2006 24:00'转换为'11/11/2006 24:00'。但是请注意,以上内容是不安全,因为根据时间戳的格式,此操作将/将不起作用。对于上述情况,它将(可能)有效,因为只有一个冒号。但是,例如,如果datetime也有几秒钟,则过滤器可能会为00:24:00触发,因此可能需要一些额外的工作才能使其工作。

答案 1 :(得分:1)

您的数据不遵循Python / Pandas datetime对象使用的约定。应该只有一种存储特定datetime的方法,即'10/11/2006 24:00'应该重写为'11/11/2006 00:00'

这是解决问题的一种方法:

# find datetimes which have '24:00' and rewrite
twenty_fours = df['strings'].str[-5:] == '24:00'
df.loc[twenty_fours, 'strings'] = df['strings'].str[:-5] + '00:00'

# construct datetime series
df['datetime'] = pd.to_datetime(df['strings'], format='%d/%m/%Y %H:%M')

# add one day where applicable
df.loc[twenty_fours, 'datetime'] += pd.DateOffset(1)

这里有一些数据需要测试:

dateList = ['10/11/2006 24:00', '11/11/2006 00:00', '12/11/2006 15:00']
df = pd.DataFrame({'strings': dateList})

上述转换后的结果:

print(df['datetime'])

0   2006-11-11 00:00:00
1   2006-11-11 00:00:00
2   2006-11-12 15:00:00
Name: datetime, dtype: datetime64[ns]

答案 2 :(得分:0)

如文档(https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior所示),小时数从00到23。那么24:00就是一个错误。