使用apply function pandas更正日期

时间:2017-03-25 04:09:39

标签: python pandas datetime dataframe timestamp

我有一个DataFrame,日期格式如下:

12/31/2000 20:00 (月/日/年时:分钟)

问题是数据集中存在一些错误的日期,例如:

10/12/2003 24:00 10/13/2003 00:00

这是我运行dfUFO [wrongFormat]

时得到的

enter image description here

所以我在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

1 个答案:

答案 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']

     

或复数相同的