对应时迭代 Dataframe 和格式化日期
Iterate Dataframe and format dates when correspond
我有这个 .csv 文件
我想使用 Glue 将它带到 AWS 中的 Redshift 数据库。
我有这个查询来将列数据类型从 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 table 将只有 varchar 字段。现在这是真实的东西:
我需要迭代从 csv 文件中获取的数据框,并尝试识别类似日期格式的字符串并使用特定格式解析它们,然后我可以再次将它们解析为字符串并最终插入 table.
这是我尝试过的最后一件事,它应该迭代每一行并分析它的数据类型,如果它是对象(在其中数据框处理字符串)它将尝试使用声明的格式解析值,如果不是,那么就通过并继续:
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 结构,此服务使用 varchars 在 Redshift 中创建了许多不同的 table。所以它必须能够识别写成字符串的类日期格式。
尝试更改这些行:
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)
我有这个 .csv 文件
我想使用 Glue 将它带到 AWS 中的 Redshift 数据库。
我有这个查询来将列数据类型从 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 table 将只有 varchar 字段。现在这是真实的东西: 我需要迭代从 csv 文件中获取的数据框,并尝试识别类似日期格式的字符串并使用特定格式解析它们,然后我可以再次将它们解析为字符串并最终插入 table. 这是我尝试过的最后一件事,它应该迭代每一行并分析它的数据类型,如果它是对象(在其中数据框处理字符串)它将尝试使用声明的格式解析值,如果不是,那么就通过并继续:
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 结构,此服务使用 varchars 在 Redshift 中创建了许多不同的 table。所以它必须能够识别写成字符串的类日期格式。
尝试更改这些行:
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)