pandas时间处理

时间戳转 datetime
查看日期是第几周
根据周求日期
pandas 生成时间序列
时间偏移

时间戳转 datetime

1
2
3
4
5
6
7
8
9
10
11
import time
import datetime

timstamp = int(time.time())
datetime.datetime.utcfromtimestamp(timstamp)
# output utc datetime
# datetime.datetime(2017, 12, 1, 8, 13, 43)

datetime.datetime.fromtimestamp(timstamp[, tz])
# output local datetime
# datetime.datetime(2017, 12, 1, 16, 13, 43)

查看日期是第几周

1
2
3
4
import datetime
start_dt = datetime.datetime.strptime('2017-12-05', '%Y-%m-%d')
start_dt.isocalendar()[1]
# Out[16]: 49

根据周求日期

1
2
3
4
time.strptime('2017480', '%Y%U%w') # 2017年48周 周日

datetime.weekday() # 获取一周的第几天 [0, 6]
datetime.isocalendar() # 获取年、第几周[1, +oo]、第几天[1, 7]

字符转换格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
%a: 星期的简写。如 星期三为Web
%A: 星期的全写。如 星期三为Wednesday
%b: 月份的简写。如4月份为Apr
%B: 月份的全写。如4月份为April
%c: 日期时间的字符串表示。(如: 04/07/10 10:43:39)
%d: 日在这个月中的天数(是这个月的第几天)
%f: 微秒(范围[0,999999])
%H: 小时(24小时制,[0, 23])
%I: 小时(12小时制,[0, 11])
%j: 日在年中的天数 [001,366](是当年的第几天)
%m: 月份([01,12])
%M: 分钟([00,59])
%p: AM或者PM
%S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~)
%U: 周在当年的周数当年的第几周),星期天作为周的第一天
%w: 今天在这周的天数,范围为[0, 6],6表示星期天
%W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
%x: 日期字符串(如:04/07/10)
%X: 时间字符串(如:10:43:39)
%y: 2个数字表示的年份
%Y: 4个数字表示的年份
%z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
%Z: 时区名称(如果是本地时间,返回空字符串)
%%: %% => %

pandas 日期

生成日期序列

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
import numpy ad np

longer_ts = pd.Series(np.random.rand(1000), index=pd.date_range('1/1/2000', periods=1000))
# In [70]: longer_ts['2001']
# Out[70]:
# 2001-01-01 0.822498
# 2001-01-02 0.455563
# 2001-01-03 0.845438
# 2001-01-04 0.924114
# 2001-01-05 0.287750
# 2001-01-06 0.535029
#...

每隔一段时间时间切片

1
pd.date_range('2000-01-01', periods=10,  periods=10, freq='1h30min')
1
2
3
4
5
6
7
Out[116]:
DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 01:30:00',
'2000-01-01 03:00:00', '2000-01-01 04:30:00',
'2000-01-01 06:00:00', '2000-01-01 07:30:00',
'2000-01-01 09:00:00', '2000-01-01 10:30:00',
'2000-01-01 12:00:00', '2000-01-01 13:30:00'],
dtype='datetime64[ns]', freq='90T')

偏移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
In [123]: ts
Out[123]:
2000-01-31 0.266391
2000-02-29 -0.528959
2000-03-31 -1.013039
2000-04-30 -1.206905
Freq: M, dtype: float64

In [124]: ts.shift(1, freq='90T')
...:
Out[124]:
2000-01-31 01:30:00 0.266391
2000-02-29 01:30:00 -0.528959
2000-03-31 01:30:00 -1.013039
2000-04-30 01:30:00 -1.206905
Freq: M, dtype: float64

In [125]: ts.shift(2)
Out[125]:
2000-01-31 NaN
2000-02-29 NaN
2000-03-31 0.266391
2000-04-30 -0.528959
Freq: M, dtype: float64

In [126]: ts.shift(2, freq='M')
Out[126]:
2000-03-31 0.266391
2000-04-30 -0.528959
2000-05-31 -1.013039
2000-06-30 -1.206905
Freq: M, dtype: float64

In [127]: ts.shift(3, freq='D')
Out[127]:
2000-02-03 0.266391
2000-03-03 -0.528959
2000-04-03 -1.013039
2000-05-03 -1.206905
dtype: float64

按月求平均

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
In [128]: ts = pd.Series(np.random.randn(20),
...: index=pd.date_range('1/15/2000', periods=20, freq='4d'))
...: ts
...:
Out[128]:
2000-01-15 -0.209952
2000-01-19 0.226069
2000-01-23 0.346459
2000-01-27 0.307560
2000-01-31 -0.749712
2000-02-04 -1.241700
2000-02-08 0.827360
2000-02-12 1.157611
2000-02-16 -0.303152
2000-02-20 0.703649
2000-02-24 2.449799
2000-02-28 -1.470502
2000-03-03 -0.311032
2000-03-07 0.698538
2000-03-11 0.171358
2000-03-15 -1.328993
2000-03-19 0.346595
2000-03-23 -0.681117
2000-03-27 -0.000089
2000-03-31 1.598276
Freq: 4D, dtype: float64

In [129]: ts.resample('M').mean()
...:
Out[129]:
2000-01-31 -0.015915
2000-02-29 0.303295
2000-03-31 0.061692
Freq: M, dtype: float64

image

根据第几周求日期

1
2
3
import datetime

datetime.datetime.strptime(str(date_list[idx][0]) + str(data[0]) + '0', '%Y%W%w')

根据日期求是第几周

1
2
3
4
date = '2018-1-1'

year = date.isocalendar()[0]
week = date.isocalendar()[1]