python数据处理常用操作

参考链接

Pandas中的条件替换值(where, mask)

数据描述

data.info()
describe = data["power"].describe()
data["power"].quantile(0.1)  # 获取10%分位数

动态创建变量

# 分别提起每个时间段的数据集合
for i in range(24):
    name = "d" + str(i)
    globals()[name] = data[data["ds"].dt.hour == i]

读取数据与保存

# 读取excel文件
df = pd.read_excel("data.xlsx", index_col=None,header=[0, 1])  # 如果是多重columns指定header参数
# 读取csv文件
df = pd.read_csv("data.csv")
# 你不需要所有的列,你可以指定需要的列“usecols”参数时,读取数据集:
df = pd.read_csv('data.csv', usecols=['col1', 'col2'])


# 数据保存
pd.to_excel("data.xlsx", index=False, encoding='utf_8_sig',parse_dates=['ds'])
df.to_csv("data.csv", index=False, encoding='utf_8_sig')

数据切片


# 切片后类型为Series
df["y"]
df.loc[:,"y"]
df.iloc[:,0]

# 切片后类型为DataFrame
df[["y"]]
df.loc[:,["ds","y"]]
df.iloc[:,:1]

# 切片筛选,赋值
df.loc[df['A'] < 0, 'A'] = -100
df.loc[~(df['A'] < 0), 'A'] = 100

数据处理操作

# apply函数
df["trend_diff2"] = df["trend"].diff(1).diff(1).apply(lambda x: abs(x))
# 移动并做缺失值处理
df["power1"] = df["power"].shift(1).fillna(method="bfill")
# 移动平均
df["move_mean"] = df["power"].rolling(window=windows, min_periods=1).mean(numeric_only=True) 
# 累计平均 
df["cum_mean"] = df["y"] / (data.index + 1)  

不规律时间序列处理方法(时间序列对齐)

计算线性插值:对于每个需要插值的时间点,在找到的插值区间内,使用线性插值公式计算估计值。线性插值公式如下:

插值值
= ((x2 - x) * y1 + (x - x1) * y2) / (x2 - x1)
= (y2-y1) / (x2 - x1) * (x-x1) + y1

其中,(x1, y1) 和 (x2, y2) 是已知数据点的坐标,x1 和 x2 分别是这两个数据点的时间值,x 是需要插值的时间点,插值值是估计的数据值。

from scipy import interpolate
# 已有时间序列df包含'ds' 和 'cumsum'两列。

# 时间序列去重
data = data.drop_duplicates(["ds"])
# 创建插值函数
interpolation_function = interpolate.interp1d(data["ds"].apply(lambda x: x.timestamp()),
                                              data['cumsum'].values, kind='linear',
                                              fill_value='extrapolate')
# 设置index为时间索引
data = data.set_index("ds")
# 创建对齐后的时间序列,用于插值
processed_data = data.copy().resample('10min').asfreq()
processed_data = processed_data.reset_index()

# 使用插值函数计算新的值
interpolated_values = interpolation_function(processed_data["ds"].apply(lambda x: x.timestamp()))
processed_data["cumsum"] = interpolated_values

数据筛选

# 特定值筛选
df[(df['size'] == 'small') | (df['size'] == 'medium')]
# 方法二:简约/可扩展性强
# pandas字符串列有一个“str”访问器,它实现了许多简化字符串操作的函数。其中之一是“contains”函数,它支持使用正则表达式进行搜索。
df[df['size'].str.contains('small|medium')]

# 包含特定字符串
df = df[df["meter_id"].str.contains("公共照明")]
# 包含某些值
df = df[df["y"].isin([2, 4])]
# 介于之间
# 方法一:
recent_df = df[(df["ds"] >= last_time) & (df["ds"] <= current_time)]
# 方法二:可读性强
recent_df = df[df["ds"].between(last_time, current_time)]

重命名

df.rename(columns={"datetime": "ds"})

转化为时间序列格式

df["ds"] = pd.to_datetime(df["ds"],format="%Y-%m-%d %H:%M:%S")

# 做时区转换    # unit="ms"时间戳(13位)精确到微秒
data["ds"] = pd.to_datetime(data["ds"], unit="ms", utc=True)  
data["ds"] = data["ds"].dt.tz_convert("Asia/Shanghai")
# 如果已经知道了不同地区相差多少个时区
data["ds"] = pd.to_datetime(data["ds"], unit="ms")
data['ds'] = data['ds'] + pd.Timedelta(hours=8)

DataFrame中时间格式的转化

字符串转datetime转时间戳

import pandas as pd
# 创建一个示例DataFrame
data = {'datetime': ['2023-09-11 14:30:00', '2023-09-11 15:45:00', '2023-09-11 16:00:00']}
df = pd.DataFrame(data)
# 将'datetime'列转化为Datetime格式
df['datetime'] = pd.to_datetime(df['datetime'])
# 将Datetime格式的时间信息转化为时间戳
df['timestamp'] = df['datetime'].apply(lambda x: x.timestamp())

生成时间索引

start_date = datetime(2023, 1, 1)
end_date = datetime(2023, 1, 2)  # 生成一天的数据
time_range = pd.date_range(start=start_date, end=end_date, freq='10T')

time_range = pd.date_range(start=start_date, freq="10min", periods=24*6)

数据重采样

条件:
(1)index是datetime格式
(2)明确是针对某一列操作还是多列操作

# 采样+处理逻辑(求和、平均)
df.set_index("ds").resample("15min").sum(numeric_only=True)

# 只做采样
data = data.resample('10min').asfreq()

滞后

data["power1"] = data["power"].shift(1).fillna(method="bfill",limit=1) # 如果相邻空值有多个只会填充一个。
data["power1"] = data["power"].shift(-1).fillna(method="ffill") # 用前一个值填充

数据去重

drop_duplicates(subset: keep: Literal[“first”, “last”, False] = “first”, inplace: bool = False,ignore_index: bool = False)

data = data.drop_duplicates(["ds","y"],keep="last",ignore_index=False)

缺失值填充

fillna(value,method,axis,inplace,limit)

data["y"] = data["y"].fillna(data.mean(numeric_only=True)) # 用均值填充

代替值

data = data.replace(-999,np.nan)  # 把-999替换成np.nan
data = data.replace([-999,1000],np.nan)  # 把-999和1000都替换成np.nan
data = data.replace({-999:np.nan, 1000:0})  # 分别替换 

移动平均

data["move_mean"] = data["power"].rolling(window=windows, min_periods=1).mean()

数据拼接

# 按行追加拼接
# pandas
df= pd.concat([df, new_df], axis=0, ignore_index=True) 
# numpy
data = np.concatenate([data1, data2])

# 按照某个字段连接(对于时间序列,相当于直接拼接+去重)
merged_df = pd.merge(df, new_df, on='time', how='outer')

数据删除

inplace = True # 在原序列上操作
# 删除行
df.drop(df.index[0]) # 传入需要删除的index

# 删除列
df.drop(columns=[""]) # 传入需要删除的列名

你可能感兴趣的:(数据处理,python,开发语言)