【问题标题】:Iterate Dataframe and format dates when correspond对应时迭代数据框和格式化日期
【发布时间】:2021-08-24 17:31:40
【问题描述】:

我有这个 .csv 文件

我想使用 Glue 将它带到 AWS 中的 Redshift 数据库。

我有这个查询来将列数据类型从红移映射到数据框架数据类型:

query = "SELECT column_name, case when data_type in ('bigint', 'integer') then 'int' when data_type in ('numeric') then 'float64' when data_type like 'double%' then 'float' else 'str' end data_type  FROM information_schema.columns where table_schema='reportes_bi' and table_name='" + tableName.lower() + "';"

所以,当我迭代列时,它会打印:

{
    "last_name": "str",
    "first_name": "str",
    "identifier": "str",
    "login": "str",
    "fechaprueba": "str"
}

基本上,所有值都被视为字符串,因此 redshift 表将只有 varchar 字段。现在这是真实的事情: 我需要迭代从 csv 文件中获得的数据框,并尝试识别类似日期格式的字符串并用特定格式解析它们,这样我就可以再次将它们解析为字符串并最终插入表中。 这是我尝试过的最后一件事,它应该迭代每一行并分析它的数据类型,如果它是对象(其中数据框处理字符串),它将尝试用声明的格式解析值,如果不是,那么就通过并继续:

formato = date_format # %Y/%m/%d
    for x in df.columns:
        if df[x].dtypes == object:
            try:
                enm = df.apply(lambda row: row[x].strptime(formato), axis=1)
                print(enm)
                df[x] = str(enm)
            except:
                pass

我尝试使用.iterrows(), .itertuples(), .iteritems() and .items() 进行迭代,使用df[x].dtypes == str(df[x]), df[x].dtypes == df[x].str.contains('').any() 进行条件,但似乎没有任何效果。 我已经阅读了有关迭代数据帧的文档,但在绝望中我一直在尝试很多无意义的混合选项。

为什么不只声明我要迭代和解析的日期列? 因为该服务根据收到的 csv 结构在 Redshift 中使用 varchars 创建了许多不同的表。所以它必须能够识别写成字符串的类日期格式。

【问题讨论】:

    标签: python amazon-web-services dataframe amazon-redshift aws-glue


    【解决方案1】:

    尝试更改这些行:

    try:
        enm = df.apply(lambda row: row[x].strptime(formato), axis=1)
        print(enm)
        df[x] = str(enm)
    

    致这些:

    try:
        df[x] = df[x].apply(lambda x: x.strptime(formato), axis=1)
    

    【讨论】:

    • 抱歉回复晚了。您的答案可能是我需要的,因为现在我收到有关不兼容镶木地板架构的错误。现在我必须调整一些事情来解决它。也就是说,我会将您的答案标记为“答案”。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2016-01-05
    • 1970-01-01
    • 2022-01-13
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多