pandas polars 数据类型转换
数据类型 | Python | Polars | Pandas | 详情 |
Boolean | Boolean | Boolean | 有效进行位打包的布尔类型。 | |
Int8 | Int8 | Int8 | 8可变精度有符号整数类型。8位有符号整数,取值范围是 -128 到 127。 | |
Int16 | Int16 | Int16 | 16可变精度有符号整数类型。16位有符号整数,取值范围是 -32768 到 32767。 | |
Int32 | Int32 | Int32 | 32可变精度有符号整数类型。32位有符号整数,取值范围是 -2147483648 到 2147483647。 | |
Int64 | Int64 | Int64 | 64可变精度有符号整数类型。64位有符号整数,取值范围非常大。在64位系统上,这是默认的整数类型。此外,还有无符号整数类型,如 `uint8`、`uint16` 等,表示无符号的整数值。 | |
UInt8 | UInt8 | UInt8 | 8可变精度无符号整数类型。 | |
UInt16 | UInt16 | UInt16 | 16可变精度无符号整数类型。 | |
UInt32 | UInt32 | UInt32 | 32可变精度无符号整数类型。 | |
UInt64 | UInt64 | UInt64 | 64可变精度无符号整数类型。 | |
Float32 | Float32 | Float32 | 32可变精度有符号浮点数。32位单精度浮点数。 | |
Float64 | Float64 | Float64 | 64可变精度有符号浮点数。64位双精度浮点数,在64位系统上是默认的浮点类型。它可以表示带有小数部分的数值,例如 `3.14` 。 | |
Decimal | Decimal | 十进制128位类型,具有可选的精度和非负小数位数。如果您需要对浮点数的精度以及对它们执行的作进行精细控制,请使用此选项。请参阅 Python的十进制。Decimal 提供有关什么是decimal数据类型的文档。 | ||
String | String | 可变长度UTF-8编码的字符串数据,通常为人类可读。 | ||
Binary | Binary | 存储任意长度的原始二进制数据。 | ||
Date | Date | 表示日历日期。 | ||
Time | Time | 表示一天中的某个时间。 | ||
Datetime | Datetime | 表示日历日期和时间。 | ||
Duration | Duration | 表示持续时间。 | ||
Array | Array | 每个序列具有已知固定形状的数组;类似于NumPy数组。详细了解数组和列表的区别以及如何使用两者。 | ||
List | List | 长度可变的均质1D容器。详细了解数组和列表的区别以及如何使用两者。 | ||
Object | Object | 包装任意Python对象。 | ||
Categorical | Categorical | 对字符串数据进行高效编码,其中类别是在运行时推断的。详细了解分类和枚举的区别以及如何使用两者。 | ||
Enum | Enum | 对一组预先确定的字符串类别进行高效的有序编码。详细了解分类和枚举的区别以及如何使用两者。 | ||
Struct | Struct | 可以存储多个字段的复合产品类型。在其专门的文档部分了解更多关于数据类型 Struct 的信息。 | ||
Null | 表示null值。 |
import pandas as pd
import polars as pldf = pd.DataFrame({'text_to_float': ["3.1415926", "2.71828", "invalid"],'text_to_int': ["123", "456.7", "789"],'text_to_date': ["2023-01-01", "15/02/2023", "invalid"],'numeric': [3.1415926, 2.71828, 1.0]
})# 批量转换
df['float64'] = pd.to_numeric(df['text_to_float'], errors='coerce').round(4)
df['float64'].fillna(0,inplace=True)
df['float32'] = df['float64'].astype('float32')
df['int64'] = pd.to_numeric(df['text_to_int'], errors='coerce').round().astype('Int64')
df['datetime'] = pd.to_datetime(df['text_to_date'],format="%Y-%m-%d %H:%M:%S", errors='coerce')
df['datetime'].fillna(pd.to_datetime("1970-01-01",format="%Y-%m-%d %H:%M:%S"),inplace=True) # 替换给指定日期
df['date_to_text'] = df['datetime'].dt.strftime('%Y-%m-%d')
df['date_to_text'].fillna("1970-01-01",inplace=True)
df['numeric_to_text'] = df['numeric'].apply(lambda x: f"{x:.4f}")
df['numeric_to_text'] = df['numeric'].round(4).astype(str) # 先四舍五入再转文本print(df)
print(df.dtypes) # 查看各列类型
import pandas as pd
import polars as pldf = pl.DataFrame({"text_float": ["3.1415926", "2.71828", "invalid"],"text_int": ["123", "456.0", "invalid"],"date_text": ["2023-01-01", "15/02/2023", "invalid"],"numeric": [3.1415926, 2.71828, 1.0],"numeric_www": [3.1415926, 2.71828, 2]
})df = df.with_columns(# 文本→浮点 先转数值→转失败为null→null替换为0pl.col("text_float").cast(pl.Float64,strict=False).fill_null(0).round(4).alias("float64"),# 文本→整数 先转数值→转失败为null→null替换为0pl.col("text_int").cast(pl.Float64,strict=False).cast(pl.Int64,strict=False).alias("int64").fill_null(0),# 文本→日期(指定格式) 文本→先转日期→转失败为null→null替换为指定日期文本→再转日期# pl.col("date_text").str.to_date().alias("datetime"),pl.col("date_text").str.strptime(pl.Date, "%Y-%m-%d",strict=False) # 文本→先转日期.fill_null("2023-01-02").str.strptime(pl.Date, "%Y-%m-%d"), # null替换为指定日期文本# 日期→文本 日期→# pl.col("date_text").strftime("%Y-%m-%d").alias("date_str"),# pl.col("date_text").cast(pl.Utf8).alias("date_str"),pl.col("date_text").str.strptime(pl.Date, "%Y-%m-%d", strict=False) # 先转为日期类型.fill_null("2023-01-02").str.strptime(pl.Date, "%Y-%m-%d").dt.strftime("%Y年%m月%d日") # 再格式化为目标文本.alias("date_str"),# 其他转文本pl.col("numeric_www").cast(pl.Utf8, strict=False).alias("numeric_www_str"),# 数值→文本# pl.col("numeric").round(4).apply(lambda x: f"{x:.4f}").alias("numeric_str")
)print(df)
print(df.dtypes)
print(df.schema)