我有一个DataFrame,日期格式如下:
12/31/2000 20:00 (月/日/年时:分钟)
问题是数据集中存在一些错误的日期,例如:
10/12/2003 24:00 应 10/13/2003 00:00
这是我运行dfUFO [wrongFormat]
时得到的所以我在pandas笔记本中有以下代码来重新格式化这些日期:
def convert2400ToTimestamp(x) :
date = pd.to_datetime(x.datetime.split(" ")[0], format='%m/%d/%Y')
return date + pd.Timedelta(days=1)
wrongFormat = dfUFO.datetime.str.endswith("24:00", na=False)
dfUFO[wrongFormat] = dfUFO[wrongFormat].apply(convert2400ToTimestamp, axis=1)
此代码导致
ValueError: Must have equal len keys and value when setting with an iterable
我真的不明白这个错误意味着什么。我缺少的东西?
编辑:已更改为
dfUFO.loc[wrongFormat, 'datetime'] = dfUFO[wrongFormat].apply(convert2400ToTimestamp, axis=1)
但是日期时间现在显示的值为1160611200000000000,日期 10/11/2006
答案 0 :(得分:3)
您可以将datetime
列解析为“正确命名的”部分并使用pd.to_datetime()
:
来源DF:
In [14]: df
Out[14]:
datetime
388 10/11/2006 24:00:00
693 10/1/2001 24:00:00
111 10/1/2001 23:59:59
矢量化解决方案:
In [11]: pat = r'(?P<month>\d{1,2})\/(?P<day>\d{1,2})\/(?P<year>\d{4}) (?P<hour>\d{1,2})\:(?P<minute>\d{1,2})\:(?P<second>\d{1,2})'
In [12]: df.datetime.str.extract(pat, expand=True)
Out[12]:
month day year hour minute second
388 10 11 2006 24 00 00
693 10 1 2001 24 00 00
111 10 1 2001 23 59 59
In [13]: pd.to_datetime(df.datetime.str.extract(pat, expand=True))
Out[13]:
388 2006-10-12 00:00:00
693 2001-10-02 00:00:00
111 2001-10-01 23:59:59
dtype: datetime64[ns]
来自docs:
从DataFrame的多个列组装日期时间。按键 可以是常见的缩写,如:
['year', 'month', 'day', 'minute', 'second','ms', 'us', 'ns']
或复数相同的