datetime.dt.day以及to_datetime函数讲解(Python时序量汇总)

本文详细介绍了使用Pandas库处理时间序列数据的方法,包括如何利用to_datetime函数转换日期格式,解析不同格式的时间数据,以及如何提取年份、月份、小时等时间组件,最后讨论了时序数据的差分运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在别的博客记过pandas处理时间量的笔记,但是时间一长又忘了。。。所以决定另外写一篇记录下时序量的处理。

1.关于pandas的to_datetime函数的理解。

参考:https://blog.youkuaiyun.com/qq_36523839/article/details/79746977

df = pd.read_csv('../input/train.csv',parse_dates=["purchase_date"])

等价于:

df['purchase_date'] = pd.to_datetime(df['purchase_date'])

上面就是一个to_datetime函数的典型应用。下面说一些细节:
1.

1/17/07 has the format “%m/%d/%y”
17-1-2007 has the format “%d-%m-%Y”

2.原始时间数据是object类型的,这个object格式一般是python用来记录可变化的兑现的格式。这个格式它并不能认出是时间格式,尽管我们一眼就能看出(人和机器的区别在此)。
to_datetime之后就可以用神奇的pandas.Series.dt.day或者pandas.Series.dt.month等方法获取到真实数据了!
3.如果原始数据有的是1/17/07有的是17-1-2007的呢?
那么直接用上面的语句会报错的。应用:

data['date_parsed'] = pd.to_datetime(data['Date'],infer_datetime_format=True)

另外一种改错方式见上面链接。

2.关于datetime.dt.year等类型的理解

    df['purchase_date'] = pd.to_datetime(df['purchase_date'])
    df['year'] = df['purchase_date'].dt.year
    df['weekofyear'] = df['purchase_date'].dt.weekofyear
    df['month'] = df['purchase_date'].dt.month
    df['dayofweek'] = df['purchase_date'].dt.dayofweek
    df['weekend'] = (df.purchase_date.dt.weekday >=5).astype(int)
    df['hour'] = df['purchase_date'].dt.hour
df['purchase_date'] = pd.to_datetime(df['purchase_date'])

这一句完成了数据类型从object到datetime64的变化。之后
.dt.day等可参考官网:
在这里插入图片描述
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt.day.html#pandas-series-dt-day

3。关于时序量的做差等

train['elapsed_time'] = (datetime.date(2018, 2, 1) - train['first_active_month'].dt.date).dt.days

或者

df_hist_trans_group['new_hist_purchase_date_diff'] = 
(df_hist_trans_group['new_hist_purchase_date_max'] - 
df_hist_trans_group['new_hist_purchase_date_min']).dt.days

其实上面两种是一样的。
在这里插入图片描述
说明:

import pandas as pd
a  = pd.Series(['2017-1-2','2017-9-1'])

在这里插入图片描述
在这里插入图片描述
一切尽在不言中~~我想从上面的截图你应该明白怎么回事了~

``` import pandas as pd import numpy as np from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler import plotly.express as px import plotly.graph_objects as go from plotly.subplots import make_subplots import dask.dataframe as dd from dask.diagnostics import ProgressBar def load_data(file_path): """数据加载函数""" # 使用Dask读取大数据 # 用 Pandas 读取 Excel df = pd.read_excel(file_path) # 转为 Dask DataFrame ddf = dd.from_pandas(df) # 自动识别时间列(匹配时间格式) time_columns = [col for col in ddf.columns if ':' in col and '-' not in col] # 转换日期列并计算周信息 ddf['数据日期'] = dd.to_datetime(ddf['数据日期'], errors='coerce') ddf = ddf.dropna(subset=['数据日期']) ddf['星期'] = ddf['数据日期'].dt.weekday # 计算总用电 ddf['总用电'] = ddf[time_columns].sum(axis=1) # 转换为Pandas DataFrame(适合内存的数据) with ProgressBar(): df = ddf.compute() return df, time_columns # 加载数据 nongpai_df, time_cols = load_data(r"C:\Users\tengh\Desktop\3\测试\1.xlsx") putong_df, _ = load_data(r"C:\Users\tengh\Desktop\3\测试\乡村居民生活用电功率.xlsx") def extract_features(df): """提取多相位时序特征""" features = [] meta_data = [] # 按用户和相位分组 grouped = df.groupby(["用户/台区编号", "相序"]) for (user_id, phase), group in grouped: # 元数据存储 user_meta = { "用户/台区编号": user_id, "电表资产号": group["电表资产号"].iloc[0], "用户/台区名称": group["用户/台区名称"].iloc[0], "相位": phase } # 多日特征聚合(示例取平均值) daily_features = [] for _, daily_data in group.iterrows(): # 单日特征 day_features = [ daily_data["总用电"], daily_data[time_cols].max() - daily_data[time_cols].min(), daily_data[time_cols[20 * 4:24 * 4]].sum() / daily_data["总用电"] if daily_data["总用电"] > 0 else 0, # 夜间用电占比 daily_data[time_cols[6 * 4:15 * 4]].sum() / daily_data["总用电"] if daily_data["总用电"] > 0 else 0# 日间用电占比 ] daily_features.append(day_features) # 多日特征平均 avg_features = np.mean(daily_features, axis=0) features.append(avg_features) meta_data.append(user_meta) return np.array(features), pd.DataFrame(meta_data) # 特征提取 nongpai_features, nongpai_meta = extract_features(nongpai_df) putong_features, putong_meta = extract_features(putong_df) # 合并数据 all_features = np.vstack([nongpai_features, putong_features]) scaler = StandardScaler() scaled_features = scaler.fit_transform(all_features) # 聚类分析 kmeans = KMeans(n_clusters=8, random_state=42) clusters = kmeans.fit_predict(scaled_features) # 标记异常用户 nongpai_clusters = clusters[:len(nongpai_features)] putong_clusters = clusters[len(nongpai_features):] # 确定普通用户主导的簇 putong_dominant = np.argmax(np.bincount(putong_clusters)) abnormal_mask = (nongpai_clusters == putong_dominant) # 构建结果DataFrame result_df = nongpai_meta.copy() result_df["特征_总用电"] = nongpai_features[:, 0] result_df["特征_峰谷差"] = nongpai_features[:, 1] result_df["特征_夜间用电"] = nongpai_features[:, 2] result_df["异常标记"] = abnormal_mask # 保存异常用户详细信息 abnormal_users = result_df[result_df["异常标记"]] abnormal_users.to_excel("异常用户明细.xlsx", index=False)```我现在有这天的关于煤改电的功率数据煤改电.xlsx 和普通居民用户的功率数据普通用户.xlsx ,针对煤改电.xlsx 该怎么判断这些煤改电数据是否正常,有没有普通用户叠加到它上面(用电特征和普通用户过于拟合),也就是存在窃电情况,现在用python解决,详细代码
最新发布
03-18
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值