Pandas数据类型
目录
数据类型
类型转换
seriers.astype函数转换数据类型
pd.to_numeric函数字符串转数字类型
datetime时间类型
python中的datetime类型
读取数据时指定列为datetime类型
pd.to_datetime将字符串转换为时间日期类型
提取datetime类型数据中具体时间
datetime类型的series进行时间计算
datetime类型数据作为df索引
timedelta时间差类型
python中的timedelta类型
Pandas中的timedelta类型
pd.to_timedelta函数转换timedelta类型
timedelta类型数据作为df索引
数据类型
Pandas数据类型 | Python类型 | 说明 |
object | str | 字符串 |
int64 | int | 整数 |
float64 | float | 浮点数 |
bool | bool | 布尔值 |
category | 无原生类型 | 分类类型 |
datetime | 无原生类型 | 时间日期类型 |
timedelta | 无原生类型 | 时间差类型 |
查看类型
import pandas as pd
# 加载数据
# 1 加载数据
df = pd.read_csv("../data/c_city_day.csv")
# 2 验证缺失值
print(df.info())
类型转换
seriers.astype函数转换数据类型
astype函数是通用函数,可用于把DataFrame中的任何列(Series)转换为其他dtype;可以向astype方法提供任何内置类型或numpy类型来转换列(Series)的数据类型
# 类型转换
df['PM2.5'] = df['PM2.5'].astype(object)
print(df.info())
# 类型转换
df['PM2.5'] = df['PM2.5'].astype(str)
print(df.info())
注意事项
-
astype函数要求DataFrame列的数据类型必须相同,当有些数据中有缺失,但不是NaN时(如'missing','null'等),会使整列数据变成字符串类型而不是数值型,这个时候就会报错
# 注意事项: 类型必须一致
df = pd.read_csv("../data/c_city_day.csv")
df2 = df.head().copy()
df2['NO']
df2.loc[::2, 'NO'] = 'missing'
df2['NO']
df2['NO'].astype(float)
pd.to_numeric函数字符串转数字类型
-
pd.to_numeric函数的参数errors, 它决定了当该函数遇到无法转换的数值时该如何处理
-
默认情况下,该值为raise,如果to_numeric遇到无法转换的值时,会抛出异常
-
coerce: 如果to_numeric遇到无法转换的值时,会返回NaN值
-
ignore: 如果to_numeric遇到无法转换的值时会放弃转换,什么都不做
-
import pandas as pd
# 加载数据
# 1 加载数据
df = pd.read_csv("../data/c_city_day.csv")
# 2 验证缺失值
print(df.info())
1) 默认情况下,会发生异常
print(df.info())
pd.to_numeric(df2['NO'], errors='raise') # 默认
2)coerce
pd.to_numeric(df2['NO'], errors='coerce') # 强制
3) ignore
pd.to_numeric(df2['NO'], errors='ignore') # 忽略
datetime时间类型
python中的datetime类型
-
python没有原生的datetime数据类型,需要使用datetime包
from datetime import datetime
now = datetime.now()
print(now)
print(type(now))
# dt2 = datetime(2024, 9, 10, 12, 20, 30)
dt2 = datetime(2024, 9, 10, 12)
print(dt2)
print(type(dt2))
读取数据时指定列为datetime类型
-
读取数据集时,使用参数
parse_dates=[列下标/列名]
直接将转为datetime类型
df = pd.read_csv("../data/c_city_day.csv", parse_dates=['Date'])
df.info() # 1 Date 29531 non-null datetime64[ns]
df = pd.read_csv("../data/c_city_day.csv", parse_dates=[1])
df.info()
pd.to_datetime将字符串转换为时间日期类型
df = pd.read_csv('../data/c_city_day.csv')
# 查看Date列数据类型
print(df['Date'].head())
# 将Date列数据转换为时间类型
df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].head())
提取datetime类型数据中具体时间
1) 由datetime构成的Seriers提取时间日期中的各个部分
# print(df['Date'].year) # 报错
print(df['Date'].dt.year)
print(df['Date'].dt.month)
print(df['Date'].dt.day)
print(df['Date'].dt.hour)
print(df['Date'].dt.minute)
print(df['Date'].dt.second)
print(df['Date'].dt.quarter) # 季度
print(df['Date'].dt.dayofweek + 1) # 星期,与 df['Date'].dt.weekday+1 相同
print(df['Date'].dt.weekday + 1) # 星期
-
当你直接使用
df['Date'].year
时报错,而使用df['Date'].dt.year
不报错,原因如下:-
一、直接使用
df['Date'].year
报错的原因-
如果
df['Date']
是一个普通的 Series 对象,其中包含日期时间数据,直接访问.year
属性是没有定义的操作。Python 不知道如何从一个普通的 Series 对象中提取年份信息,所以会报错。
-
-
二、使用
df['Date'].dt.year
不报错的原因-
.dt
访问器:-
对于包含日期时间数据的 Series 对象,Pandas 提供了
.dt
访问器。这个访问器允许你访问日期时间对象的各种属性和方法。 -
当你使用
df['Date'].dt
时,它返回一个新的 Series 对象,其中的每个元素都是对应的日期时间对象(如pandas.Timestamp
对象)的属性访问器。
-
-
.year
属性:-
接着,使用
.year
可以正确地提取出每个日期时间对象中的年份信息。 -
例如,如果
df['Date']
中的一个值是2024-09-19
,那么df['Date'].dt.year
会返回对应的年份2024
。
-
-
-
2) 由datetime构成的Seriers的其中一个数据提取时间日期中的各个部分
d = pd.to_datetime('2020-06-20')
print(d) # d ==> 2020-06-20 00:00:00
print(type(d)) # <class 'pandas._libs.tslibs.timestamps.Timestamp'>
print(d.year)
print(d.month)
print(d.day)
print(d.hour)
print(d.minute)
print(d.second)
print(d.quarter) # 季度
print(d.weekday()) # 星期几,与d.dayofweek相同 0是星期一 1是星期二 6是星期日
print(d.dayofweek + 1)
datetime类型的series进行时间计算
1) 日期
# 日期计算
df['Date']
2) 计算
df['Date'].min() # Timestamp('2015-01-01 00:00:00')
df['Date'].max() # Timestamp('2020-07-01 00:00:00')
df['Date'].max() - df['Date'].min() # Timedelta('2008 days 00:00:00')
df['Date'] - df['Date'].min()
datetime类型数据作为df索引
1) 将date这一列改为索引
df = pd.read_csv('../data/c_city_day.csv', parse_dates=['Date'], index_col=[1])
df.head()
2) 将索引这一列改为2016-12-01---2016-12-31
df.sort_index(inplace=True)
df['2016-12']
timedelta时间差类型
python中的timedelta类型
-
python没有原生的timedelta数据类型,需要使用datetime包
from datetime import datetime
t1 = datetime.now()
t2 = datetime(2024, 9, 30)
diff = t1 - t2
# 时间差类型
print(diff)
print(type(diff))
Pandas中的timedelta类型
-
两个时间Seriers相减即可得到timedelta类型数据构成的Seriers对象
df = pd.read_csv('../data/c_city_day.csv', parse_dates=['Date'])
df
df['dt_diff'] = df['Date'] - df['Date'].min()
df[['Date', 'dt_diff']]
pd.to_timedelta函数转换timedelta类型
-
timedelta类型转换为字符串类型
df['dt_diff'] = df['dt_diff'].astype(str)
print(df['dt_diff'].dtype)
print(df['dt_diff'])
-
字符串类型转换为timedelta类型
df['dt_diff'] = pd.to_timedelta(df['dt_diff'])
print(df['dt_diff'])
timedelta类型数据作为df索引
-
如果将timedelta类型数据作为df索引,就可以基于时间差范围来选择数据
# 读取数据,并将下标为1的Date列设为时间类型列
df = pd.read_csv('../data/c_city_day.csv', parse_dates=[1])
# 获取印度城市德里的子集
df2 = df.query('City=="Delhi"')
# 将timedelta类型的Series设置为df的索引
# df2.索引 = Date列 - Date列最早的那一天
df2.index = df2['Date'] - df2['Date'].min()
print(df2.head()) # 查看数据集
# 基于时间差范围来选择数据
print(df2['0 days':'4 days'])