datetime

Timestamp对象与datetime对象转化

d1 = pd.Timestamp("2020-9-1 10:20:21")
d2 = d1.to_pydatetime()
date = d2.date() # 获取年份,datetime对象才能这样获取
time = d2.time() # 获取时间

d1 = pd.Timestamp(d2) # datetime对象转为Timestamp对象 

将dataframe中的date列和time列合并为一列

注:date列为年月日,time列为时分秒
dtc = [['date', 'start_time']]
df1 = read_csv(StringIO(u'''
date,start_time,employee_id,session_id
01/01/2016,02:03:00,7261824,871631182
01/01/2016,06:03:00,7261824,871631183
01/01/2016,11:01:00,7261824,871631184
01/01/2016,14:01:00,7261824,871631185
'''), parse_dates=dtc)

字符串与datetime相互转化

datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
年 月 日 时 分 秒 毫秒 时区信息

from datetime import datetime

# 将datetime转为字符串
stamp = datetime(2018, 1, 1) # datetime类型
s = stamp.strftime("%Y-%m-%d") # s为字符串类型
# 将字符串转为datetime类型
stamp = datetime.strptime(s, "%Y-%m-%d") # stamp 为datetime类型, %Y-%m-%d %H:%M:%S
# 也可使用parse将更复杂的字符串变为datetime格式
from dateutil.parser import parse
stamp = parse("2018-1-1")

将字符串数组转为 DatetimeIndex

import pandas as pd
date_strs = ["2013-01-02", "2015-09-09"]
res = pd.to_datetime(date_strs) # res 为DatetimeIndex类型,是一个可迭代对象,其中每一个元素为pandas Timestamp类型
# 两个Timestamp类型的数据相减为Timedelta类型

生成某个范围内的时间戳

pd.date_range(start, end, periods, freq)
start : 开始时间戳
end: 结束时间戳(比如end="2017-2-1", 则生成的时间范围最终截止到2017-2-1 00:00:00)
periods: 整数,为要产生的总的时间戳的个数
freq: 两个时间戳之间的间隔, 默认为“D”

 - "D": 天
 - "W": 周
 - "M": 月
 - "H": 小时
 - "T or min": 分钟
 - "S": 秒

Timestamp对象与字符串转化

注意区分datetime类型、Timestamp类型和datetime[64]类型
datetime类型是python自带库datetime中的类型,而Timestamp是pandas中的类型,datetime[64]是numpy中时间类型

# 将Timestamp转化为datetime对象
a = pd.to_datetime("2020-1-1") # Timestamp类型
print(type(a))
b = a.to_datetime() # python datetime类型
print(type(b))
c = a.to_datetime64() # numpy datetime[64]类型
print(type(c))

结果:
<class 'pandas._libs.tslib.Timestamp'>
<class 'datetime.datetime'>
<class 'numpy.datetime64'>

# python的datetime模块中包含三种时间类型:
# datetime.date,datetime.time和datetime.datetime
d1 = datetime.date(2020, 1, 2)
t1 = datetime.time(11, 10, 11)
dt = datetime.combine(d1,  t1) # 将date和time组合成datetime
# 将Timestamp对象按一定格式转为字符串
timestamp.strftime("%Y-%m-%d %H:%M:%S")
# 将字符串转换为Timestamp类型
pd.to_datetime(time_str)

数据在时间轴上平移

data = pd.DataFrame(np.random.randn(100,3), index=pd.date_range("2018-10-8", periods=100), columns=["a", "b", "c"]) # 以DatetimeIndex为索引
data.shift(2) # 时间轴不变,数据整体向下移动两个时间戳,空出来的时间戳数据不NAN
data.shift(-2) # 时间轴不变,数据整体向上移动两个时间戳
data.shift(2, freq="D") # 数据不变,时间轴后移两天, 即每个时间戳加l两天
data.shift(-1, freq="H") # 数据不变,时间轴前移1小时, 即每个时间戳减一小时

按日期进行聚合操作(降采样)

data.resample(freq, closed, label)
freq: 以什么为单位进行聚合
closed = {left, right}: 默认为left, 左闭右开区间
label = {left, right}: 默认为left. 左开右闭区间
[例子][(https://www.jianshu.com/p/061771f0afa9)]

# 按天聚合, data的索引为DatetimeIndex
data.resample("D").sum()
# 按分钟聚合
data.resample("min").mean()

按日期进行升采样操作

data.resample(freq)中的freq参数设置为比data原始时间索引的单位小,比如原来以天为单位,freq设为以小时为单位。
升采样因为会生成许多时间戳,所以涉及到值的填充。
主要有3中填充的方式:

  1. NaN填充:data.resample(freq=“H”).asfreq()
  2. 前向填充:data.resample(freq=“H”).ffill()
  3. 反向填充:data.resample(freq=“H”).bfill()

滑动窗口

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
  1. 参数window可以为一个正整数或者一个offset(可以认为是时间区间长度),通过这个参数设置窗口长度;
  2. min_periods表示窗口中需要的最小的观测值数量,如果窗口中的成员个数少于这个设定的值,则这个窗口经过计算后就会返回NaN,比如,如果min_periods设为3,但当前的窗口中只有两个成员,那么该窗口就会返回空值;
  3. center参数如果设为True,表示在取窗口覆盖的区间时,以当前label为中心,向两边取,若为False,则表示以当前label为窗口的最右侧,向左侧取,默认为False,要注意的是,当为True时,如果窗口长度为奇数,则中心位置很好确定,就是最中间的位置,但是如果长度为偶数,则默认中心位置为中间偏右的那一个位置
  4. win_type参数表示不同的窗口类型,可以通过这个参数给窗口成员赋予不同的权重,默认为等权重;
  5. on参数表示对那一列进行rolling,笔者在当前最新版的pandas0.21.4中,一旦设置了on参数,则rolling函数就会失效,这可能是个bug,所以请慎用。

rolling函数返回的是window对象或rolling子类,可以通过调用该对象的mean(),sum(),std(),count()等函数计算返回窗口的值,还可以通过该对象的apply(func)函数,通过自定义函数计算窗口的特定的值
rolling函数不支持设置步长,执行rolling后,可以通过python双冒号切片操作取得所需结果。

data[start : end : step]

DataFrame.expanding(min_periods=1, center=False, axis=0),其中参数的意义和rolling一样,只是其不是固定窗口长度,其长度是不断的扩大的。

将两个以DatetimeIndex为索引的dataframe进行合并

index1 = pd.date_range(start="2018-10-1", end="2018-10-2", freq="5min")
index2 = pd.date_range(start="2018-10-1", end="2018-10-2", freq="10min")

data1 = pd.DataFrame(np.arange(1, 290, 1), index=index1)
data2 = pd.DataFrame(np.arange(1, 146, 1), index=index2)
pd.concat([data1, data2], axis=1) # 合成的dataframe的索引为细粒度时间戳, 对不上的时间戳为NaN

以DatetimeIndex类型作为索引的df的切片

df = pd.DataFrame(np.arange(33), columns=["a"], index = pd.date_range("2018-1-2", periods=33))
df.loc["2018-1"] # 取2018年1月份的所有数据, 注意如果是df必须要加loc, Series可以不加,因为df不加loc默认是取列
df.loc["2018-1-2": "2018-1-5"] # 取2018-1-2到2018-1-5号的数据,包括1.2与1.5

时间戳加减操作

datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

from datetime import timedelta
t1 = pd.to_datetime("2018-1-2")
timedelta = timedelta(days=2)
t2 = t1 + timedelta # 2018-1-4

时间序列画图

def create_features(df, label=None):
    """
    Creates time series features from datetime index
    """
    df = df.copy()
    df['date'] = df.index
    df['hour'] = df['date'].dt.hour
    df['dayofweek'] = df['date'].dt.dayofweek
    df['quarter'] = df['date'].dt.quarter
    df['month'] = df['date'].dt.month
    df['year'] = df['date'].dt.year
    df['dayofyear'] = df['date'].dt.dayofyear
    df['dayofmonth'] = df['date'].dt.day
    df['weekofyear'] = df['date'].dt.weekofyear
    
    X = df[['hour','dayofweek','quarter','month','year',
           'dayofyear','dayofmonth','weekofyear']]
    if label:
        y = df[label]
        return X, y
    return X
sns.pairplot(features_and_target.dropna(),
             hue='hour', # 用hour对颜色打标签
             x_vars=['hour','dayofweek','year','weekofyear'],
             y_vars='PJME_MW',
             height=5,
             plot_kws={'alpha':0.1, 'linewidth':0}
            )
plt.suptitle('Power Use MW by Hour, Day of Week, Year and Week of Year')
plt.show()

在这里插入图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值