【问题标题】:Python Handling differenct date formats in a columns including nullPython处理包含null的列中的不同日期格式
【发布时间】:2020-10-24 08:32:52
【问题描述】:

我有一个带有日期列的 csv,所以在使用 pandas 获取它之后。我正在尝试插入 mysql 数据库。 我的要求是它应该查找空值并将它们设为“无”,然后无论日期格式如何,它都应该将其转换为 2019-07-02 这种格式。下面是我的代码

df = pd.read_csv (r'C:\Users\adminuser\Desktop\CSAExcel\test.csv', parse_dates =  True , usecols = ['number','active','short_description','incident_state','caller_id','assignment_group','assigned_to','sys_created_on','sys_created_by','opened_at','opened_by','closed_at','closed_by','resolved_at','u_reported_by','u_reported_by.country','u_type'],encoding='cp1252')
df2 = df1.replace(np.nan, '', regex=True) 
df2['created_on']= df2['created_on'].apply(lambda t: None if pd.isnull(t) else datetime.datetime.fromtimestamp(t).strftime('%Y-%m-%d'))

我收到错误,需要整数(类型为 str)

【问题讨论】:

    标签: python pandas date


    【解决方案1】:

    我在这里看到了一些问题。我的猜测是您花一些时间在谷歌上搜索解决方案,并且您将不同的方法结合在一起。我将尝试为您提供一种易于理解的方法,但对于解析日期等常见问题,存在各种方法。在您的 sn-p 中,有两个明显的问题。

    1. 首先将 NaN 值替换为空字符串,然后在 lambda 函数中以空值为条件,因此这是多余的。所以我们可以删除第二行。 另外,为什么你想要 None 而不是 np.nan?
    2. lambda 函数假定一个时间戳,这是一个 POSIX 时间戳,类似于 time.time() 返回的内容。 'created_on' 列不包含它,而是一个字符串。

    我的方法将执行以下操作。它使用pd.to_datetime(),它在这里完成了繁重的工作。它将 str 值转换为日期时间对象。 (实际上,它采用各种数据类型,包括字符串或字符串系列)。如果你在 to_datetime() 中传递一个 NaN 值,它将返回一个 NaT 值。那么我们将它们替换为 None。

    如果以下方法可行,你可以试试吗?

    df = pd.read_csv(r'C:\Users\adminuser\Desktop\CSAExcel\test.csv', usecols = ['number','active','short_description','incident_state','caller_id','assignment_group','assigned_to','sys_created_on','sys_created_by','opened_at','opened_by','closed_at','closed_by','resolved_at','u_reported_by','u_reported_by.country','u_type'],encoding='cp1252')
    df1['created_on']= pd.to_datetime(df1['created_on'], format='%Y-%m-%d')
    df1['created_on'] = df1['created_on'].apply(lambda t: None if pd.isnull(t) else t)
    

    这是一种显式方式,但 pandas 有一种更快的方式。在您原来的 sn-p 中,您还在 read_csv() 中使用了参数 parse_data=True。您可以打印df1.dtypes 以查看created_on 列是否已成功转换为日期时间对象。如果是这样,您只需将 NaT/NaN 值更改为 None。

    【讨论】:

    • 嗨,谢谢你的建议,但首先日期没有被解析,它们仍然是 m/d/Y 格式 custom_date_parser = lambda x: datetime.strptime(x, "%Y-%m- %d") df = pd.read_csv (r'C:\Users\adminuser\Desktop\CSAExcel\CSA_Monthly_Incident_Resolved_COM_Report.csv', parse_dates=True,date_parser=custom_date_parser, usecols = [columns],encoding='cp1252') df1['created_on']= pd.to_datetime(df1['created_on'], format='%Y-%m-%d') df1['created_on'] = df1['created_on'].apply(lambda t: None if pd.isnull(t) else t) 将所有日期设置为 null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多