【问题标题】:Function to check type datetime for cells in pandas检查熊猫中单元格类型日期时间的功能
【发布时间】:2021-05-03 14:45:25
【问题描述】:

我有一个包含两个日期时间列的大型数据集,当我尝试清理它时,我创建了一个适用于这两列的每个单元格的函数:

#dropoff_datetime
def date_time_dropoff(cell):
    if pd.isnull(cell) == True:
        return('Missing Date Time dropoff')
    elif type(cell) == datetime.datetime:
        return ('Clean Date Time dropoff')
    elif type(cell) != datetime.datetime:
        return ('Type error Date Time dropoff')

当我第一次在我的数据帧上运行它时,它返回单元格的类型错误(实际上,当我使用 df.dtypes 时,我看到它是对象类型)。所以接下来我使用 pandas 方法转换 df:

df2['Statue_dropoff_datetime'] = df['dropoff_datetime'].apply(date_time_dropoff)

并再次运行该函数,但它仍然返回类型错误,因为它不是类型 datetim.datetime。但是,一旦我在转换后使用 df.dtypes,我就会获得正确的日期时间类型:

dropoff_datetime datetime64[ns]

没有成功,我尝试了针对类似问题的建议答案,主要是: Converting object column in pandas dataframe to datetime Convert Pandas Column to DateTime Converting object to datetime format in python How to change the datetime format in pandas

顺便说一句,当我开始导入时,我使用: import datetime

这是我的 df:

dropoff_datetime
2020-06-10 11:16:00
2020-06-21 11:53:06
2020-06-09 13:25:21
2020-06-01 19:06:05

#dropoff_datetime
def date_time_dropoff(cell):
    if pd.isnull(cell) == True:
        return('Date Time dropoff missing')
    elif type(cell) == datetime:
        return ('Date Time dropoff clean')
    elif type(cell) != datetime:
        return ('Date Time dropoff Type error')

df1[‘Statue_dropoff_datetime'] = df['dropoff_datetime'].apply(date_time_dropoff)

当我打印时:

print(pd.value_counts(df1.values.ravel()))
Type error Date Time dropoff    47703

使用df.dtypes 时:

df.dtypes
dropoff_datetime        datetime64[ns]

【问题讨论】:

标签: python pandas dataframe datetime


【解决方案1】:

基本上,要检查对象是否属于某种类型,请使用isinstance。所以你的函数可能看起来像

def date_time_dropoff(cell):
    if pd.isnull(cell):
        return('Date Time dropoff missing')
    elif isinstance(cell, datetime):
        return ('Date Time dropoff clean')
    else:
        return ('Date Time dropoff Type error')

但我认为只有调用isinstance 才能更轻松地做到这一点,您可以使用它来检查类型datetime.datetime。检查pd.Timestamp 将是“更窄”的标准,同时清除 datetime.datetime。

例如:

给定一个具有混合 dtype 列的 DataFrame,

from datetime import datetime
import pandas as pd
import numpy as np

df = pd.DataFrame({'mixedcol': ['2021-01-01', datetime(2021,1,1), 
                                pd.Timestamp('2021-01-01'), 'something else', 42, np.nan]})

您可以屏蔽所有日期时间值,例如

m = df['mixedcol'].apply(lambda v: isinstance(v, datetime))

...并使用掩码将所有其他值设置为NaN。然后转换为日期时间,你应该在你想去的地方:

df['cleaned'] = pd.to_datetime(np.where(m, df['mixedcol'], np.NaN))

# df['cleaned']
# 0          NaT
# 1   2021-01-01
# 2   2021-01-01
# 3          NaT
# 4          NaT
# 5          NaT
# Name: cleaned, dtype: datetime64[ns]

【讨论】:

  • 掩码可以用 None 代替,但我的函数在转换后仍然无法识别日期时间值。 @MrFuppes
  • @Hibou:在你的函数中使用isinstance,而不是type ==
  • 有效!您能否将其添加到其他人的答案中? @MrFuppes
  • @Hibou:当然,添加了。
猜你喜欢
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2019-07-19
相关资源
最近更新 更多