我尝试过:
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'
如何正确解决?
答案 0 :(得分:1)
之所以不起作用,是因为%H
参数仅接受00
到23
(包括两者)范围内的值。因此,这意味着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就是一个错误。