pandas组队学习:task10
目录
一、时间戳
1. Timestamp的构造和属性
由pd.Timestamp实现,可以通过year, month, day, hour, min, second
可以获取具体的数值:
ts = pd.Timestamp('2020-1-1 08:10:30')
ts
Out[6]: Timestamp('2020-01-01 08:10:30')
ts.year
Out[7]: 2020
ts.month
Out[8]: 1
ts.day
Out[9]: 1
ts.hour
Out[10]: 8
ts.minute
Out[11]: 10
ts.second
Out[12]: 30
2.Datetime序列的生成
时间序列由一组时间戳组成,可以用 to_datetime
和 date_range
来生成
-
to_datetime
直接对时间戳列表进行转换:
pd.to_datetime(['2020-1-1', '2020-1-3', '2020-1-6']) Out[16]: DatetimeIndex(['2020-01-01', '2020-01-03', '2020-01-06'], dtype='datetime64[ns]', freq=None)
时间戳格式不满足转换时,强制使用format进行匹配:
temp = pd.to_datetime(['2020\\1\\1','2020\\1\\3'],format='%Y\\%m\\%d') temp Out[21]: DatetimeIndex(['2020-01-01', '2020-01-03'], dtype='datetime64[ns]', freq=None)
如果想要转为
datetime64[ns]
的序列,需要显式用Series
转化:pd.Series(temp).head() Out[22]: 0 2020-01-01 1 2020-01-03 dtype: datetime64[ns]
如果输入时间戳是表的多个列,列名必须与时间关键词列名一致:
df_date_cols = pd.DataFrame({'year': [2020, 2020], ....: 'month': [1, 1], ....: 'day': [1, 2], ....: 'hour': [10, 20], ....: 'minute': [30, 50], ....: 'second': [20, 40]}) pd.to_datetime(df_date_cols) Out[24]: 0 2020-01-01 10:30:20 1 2020-01-02 20:50:40 dtype: datetime64[ns]
-
date_range
参数为
start, end, freq, periods
,它们分别表示开始时间,结束时间,时间间隔,时间戳个数。开始或者结束日期作为端点会被包含:
pd.date_range('2020-1-1','2020-1-21', freq='10D') # 包含 Out[25]: DatetimeIndex(['2020-01-01', '2020-01-11', '2020-01-21'], dtype='datetime64[ns]', freq='10D')
3.dt对象
在时序类型的序列上定义了 dt
对象来完成许多时间序列的相关操作。
-
取出相关属性
s = pd.Series(pd.date_range('2020-1-1','2020-1-3', freq='D')) In [33]: s.dt.date Out[33]: 0 2020-01-01 1 2020-01-02 2 2020-01-03 dtype: object In [34]: s.dt.time Out[34]: 0 00:00:00 1 00:00:00 2 00:00:00 dtype: object In [35]: s.dt.day Out[35]: 0 1 1 2 2 3 dtype: int64 In [36]: s.dt.daysinmonth Out[36]: 0 31 1 31 2 31 dtype: int64
-
判断操作主要用于测试是否为月/季/年的第一天或者最后一天:
In [40]: s.dt.is_year_start # 还可选 is_quarter/month_start Out[40]: 0 True 1 False 2 False dtype: bool In [41]: s.dt.is_year_end # 还可选 is_quarter/month_end Out[41]: 0 False 1 False 2 False dtype: bool
-
取整操作包含
round, ceil, floor
,它们的公共参数为freq
,常用的包括H, min, S
(小时、分钟、秒)In [42]: s = pd.Series(pd.date_range('2020-1-1 20:35:00', ....: '2020-1-1 22:35:00', ....: freq='45min')) ....: In [43]: s Out[43]: 0 2020-01-01 20:35:00 1 2020-01-01 21:20:00 2 2020-01-01 22:05:00 dtype: datetime64[ns] In [44]: s.dt.round('1H') Out[44]: 0 2020-01-01 21:00:00 1 2020-01-01 21:00:00 2 2020-01-01 22:00:00 dtype: datetime64[ns] In [45]: s.dt.ceil('1H') Out[45]: 0 2020-01-01 21:00:00 1 2020-01-01 22:00:00 2 2020-01-01 23:00:00 dtype: datetime64[ns] In [46]: s.dt.floor('1H') Out[46]: 0 2020-01-01 20:00:00 1 2020-01-01 21:00:00 2 2020-01-01 22:00:00 dtype: datetime64[ns]
4.时间戳的切片和索引
时间戳序列作为索引使用。如果想要选出某个子时间戳序列,第一类方法是利用 dt
对象和布尔条件联合使用,另一种方式是利用切片。
-
利用dt对象
In [47]: s = pd.Series(np.random.randint(2,size=366), ....: index=pd.date_range( ....: '2020-01-01','2020-12-31')) ....: In [48]: idx = pd.Series(s.index).dt In [49]: s.head() Out[49]: 2020-01-01 1 2020-01-02 1 2020-01-03 0 2020-01-04 1 2020-01-05 0 Freq: D, dtype: int32 In [50]: s[(idx.is_month_start|idx.is_month_end).values].head() #每月的第一天或者最后一天 Out[50]: 2020-01-01 1 2020-01-31 0 2020-02-01 1 2020-02-29 1 2020-03-01 0 dtype: int32
-
利用切片
取出单日值:
In [52]: s['2020-01-01'] Out[52]: 1 In [53]: s['20200101'] # 自动转换标准格式 Out[53]: 1
取出5月初至7月15日:
In [55]: s['2020-05':'2020-7-15'].head() Out[55]: 2020-05-01 0 2020-05-02 1 2020-05-03 0 2020-05-04 1 2020-05-05 1 Freq: D, dtype: int32
二、时间差
1.Timedelta的生成
可以由两个时间戳的差,或者pd.Timedelta
生成:
In [57]: pd.Timestamp('20200102 08:00:00')-pd.Timestamp('20200101 07:35:00')
Out[57]: Timedelta('1 days 00:25:00')
In [58]: pd.Timedelta(days=1, minutes=25) # 需要注意加s
Out[58]: Timedelta('1 days 00:25:00')
In [59]: pd.Timedelta('1 days 25 minutes') # 字符串生成
Out[59]: Timedelta('1 days 00:25:00')
2.时间差序列的生成
pd.to_timedelta
In [60]: s = pd.to_timedelta(df.Time_Record)
In [61]: s.head()
Out[61]:
0 0 days 00:04:34
1 0 days 00:04:20
2 0 days 00:05:22
3 0 days 00:04:08
4 0 days 00:05:22
Name: Time_Record, dtype: timedelta64[ns]
-
timedelta_range
In [62]: pd.timedelta_range('0s', '1000s', freq='6min') Out[62]: TimedeltaIndex(['0 days 00:00:00', '0 days 00:06:00', '0 days 00:12:00'], dtype='timedelta64[ns]', freq='6T') In [63]: pd.timedelta_range('0s', '1000s', periods=3) Out[63]: TimedeltaIndex(['0 days 00:00:00', '0 days 00:08:20', '0 days 00:16:40'], dtype='timedelta64[ns]', freq=None)
3.Timedelta的运算
-
生成时间戳和时间差:
In [67]: td1 = pd.Timedelta(days=1) In [68]: td2 = pd.Timedelta(days=3) In [69]: ts = pd.Timestamp('20200101')
-
与标量的乘法运算:
In [70]: td1 * 2 Out[70]: Timedelta('2 days 00:00:00')
-
与时间戳的加减法运算:
In [73]: ts - td1 Out[73]: Timestamp('2019-12-31 00:00:00')
-
与时间差的加减法与除法运算:
In [71]: td2 - td1 Out[71]: Timedelta('2 days 00:00:00') In [72]: ts + td1 Out[72]: Timestamp('2020-01-02 00:00:00')