python
主页 > 脚本 > python >

Pandas数据分析固定时间点和时间差

2022-08-11 | F11站长开发者 | 点击:

前言

pandas处理时间的对象有很多,分别表示不同的作用。

本次介绍固定时间对象和时间长对象。

还是先导入包:

1

2

3

import numpy as np

import pandas as pd

import datetime

固定时间 时间点对象的建立

时间点就表示一个时刻的具体时间,比如现在是2022年8月10日16:31:56。

时间对象的建立有很多方法。

#使用 python 的 datetime 库,至少需要年月日

1

datetime.datetime.now()

1

2

#指定时间

datetime.datetime(2022,8,10,10,5)

1

2

3

#pandas 等第三方库都是在datetime建立时间对象的

#pd.Timestamp() 是定义时间的主要函数,代替 python 中的 datetime.datetime 对象。

pd.Timestamp(datetime.datetime(2020, 6, 8))

指定时间字符串

1

2

3

4

pd.Timestamp('2012-05-01')

# Timestamp('2012-05-01 00:00:00')

pd.Timestamp('2017-01-01T12')

# Timestamp('2017-01-01 12:00:00')

#指定时间位置数字,可以依次定义 year, month, day,hour, minute, second, microsecond

1

2

3

4

5

6

pd.Timestamp(2012, 5, 1)

# Timestamp('2012-05-01 00:00:00')

pd.Timestamp(2017, 1, 1, 12)

# Timestamp('2017-01-01 12:00:00')

pd.Timestamp(year=2017, month=1, day=1, hour=12)

# Timestamp('2017-01-01 12:00:00')

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#解析时间戳

pd.Timestamp(1513393355.5, unit='s') # 单位为秒

# Timestamp('2017-12-16 03:02:35.500000')

#指定时区

pd.Timestamp(1513393355, unit='s', tz='US/Pacific')

# Timestamp('2017-12-15 19:02:35-0800', tz='US/Pacific')

# 指定为北京时间

pd.Timestamp(1513393355, unit='s', tz='Asia/Shanghai')

# Timestamp('2017-12-16 11:02:35+0800', tz='Asia/Shanghai')

 #特殊时间

#以下可取得当前时间,从而可通过属性取到今天日期、年份等信息:

pd.Timestamp('today')

pd.Timestamp('now')

# Timestamp('2022-08-10 10:11:56.532981')

pd.Timestamp('today').date() # 只取日期

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#也可以计算出昨天、明天等信息:

# 昨天

pd.Timestamp('now')-pd.Timedelta(days=1)

# Timestamp('2020-06-08 16:14:39.254365')

# 明天

pd.Timestamp('now')+pd.Timedelta(days=1)

# Timestamp('2020-06-10 16:15:28.019039')

# 当月初,一日

pd.Timestamp('now').replace(day=1)

# Timestamp('2020-06-01 16:15:28.019039')

 #时间限制

#由于 Pandas 以纳秒粒度表示时间戳,因此可以使用64位整数表示的时间跨度限制为大约584年:

pd.Timestamp.min

# Timestamp('1677-09-21 00:12:43.145225')

pd.Timestamp.max

# Timestamp('2262-04-11 23:47:16.854775807')

时间属性

一个具体的时间包含了非常丰富的信息,如年份、在周几、在几月、在哪个季度,需要我们进行属性的读取。

1

2

3

#先创建一个时间

time = pd.Timestamp('now')

time

 以下是丰富的时间属性:

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

time.asm8 # 返回 numpy datetime64格式(以纳秒为单位)。

#numpy.datetime64('2022-08-10T09:58:52.365676000')

time.dayofweek # 1 周几,周一为0

time.day_of_week # 同上

time.dayofyear # 161, 一年的第几天

time.day_of_year # 同上

time.days_in_month # 30 当月有多少天

time.daysinmonth # 30 同上

time.freqstr # None, 周期字符

time.is_leap_year # True 是否闰年,公历的

time.is_month_end # False 是否当月最后一天

time.is_month_start # False 是否当月第一天

time.is_quarter_end # False 是否当季最后一天

time.is_quarter_start # False 是否当季第一天

time.is_year_end # 是否当年最后一天

time.is_year_start # 是否当年第一天

time.quarter # 2 当前季度数

# 如指定会返回类似 <DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>

time.tz # None 当前时区别名

time.week # 24 当年第几周

time.weekofyear # 24 同上

time.day # 9 日

time.fold # 0

time.freq # None 频度周期

time.hour # 16

time.microsecond # 890462

time.minute # 46

time.month # 6

time.nanosecond # 0

time.second # 59

time.tzinfo # None

time.value # 1591721219890462000

time.year # 2020

时间方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

time = pd.Timestamp('now', tz='Asia/Shanghai')

# Timestamp('2020-06-09 16:55:58.027896+0800', tz='Asia/Shanghai')

#方法如下:

# 转换为指定时区

time.astimezone('UTC')

# Timestamp('2020-06-09 08:55:58.027896+0000', tz='UTC')

# 转换单位,向上舍入

time.ceil('s') # 转为以秒为单位

# Timestamp('2020-06-09 16:55:59+0800', tz='Asia/Shanghai')

time.ceil('ns') # 转为以纳秒为单位

time.ceil('d') # 保留日

time.ceil('h') # 保留时

# 转换单位, 为向下舍入

time.floor('h') # 保留时

# Timestamp('2020-06-09 17:00:00+0800', tz='Asia/Shanghai')

# 类似四舍五入

time.round('h') # 保留时

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

# 返回星期名

time.day_name() # 'Tuesday'

# 月份名称

time.month_name() # 'June'

  

# 将时间戳规范化为午夜,保留tz信息。

time.normalize()

# Timestamp('2020-06-09 00:00:00+0800', tz='Asia/Shanghai')

  

# 时间元素替换 datetime.replace,可处理纳秒。

time.replace(year=2019) # 年份换为2019年

# Timestamp('2019-06-09 17:14:44.126817+0800', tz='Asia/Shanghai')

time.replace(month=8) # 月份换为8月

# Timestamp('2020-08-09 17:14:44.126817+0800', tz='Asia/Shanghai')

  

# 转为周期类型,将丢失时区

time.to_period(freq='h') # 周期为小时

# Period('2020-06-09 17:00', 'H')

  

# 转为指定时区

time.tz_convert('UTC') # 转为 utc 时间

# Timestamp('2020-06-09 09:14:44.126817+0000', tz='UTC')

# 本地化时区转换

time = pd.Timestamp('now')

time.tz_localize('Asia/Shanghai')

# Timestamp('2020-06-09 17:32:47.388726+0800', tz='Asia/Shanghai')

time.tz_localize(None) # 删除时区

时间缺失值

1

2

3

pd.Timestamp(pd.NaT)

#参与计算

pd.NaT+pd.Timestamp('20201001')

.dt 时间访问器

#对于时间序列数据,可以使用 s.dt.xxx 的形式来访问它们的属性和调用它们的方法:

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

41

42

43

44

45

46

47

48

49

50

51

52

53

54

s = pd.Series(pd.date_range('2020-01-01', periods=3, freq='d'))

s.dt.date

s.dt.time

s.dt.timetz

s.dt.year

s.dt.month

s.dt.day

s.dt.hour

s.dt.minute

s.dt.second

s.dt.microsecond

s.dt.nanosecond

s.dt.week

s.dt.weekofyear

s.dt.dayofweek

s.dt.weekday

s.dt.dayofyear

s.dt.quarter

s.dt.is_month_start

s.dt.is_month_end

s.dt.is_quarter_start

s.dt.is_quarter_end

s.dt.is_year_start

s.dt.is_year_end

s.dt.is_leap_year

s.dt.daysinmonth

s.dt.days_in_month

s.dt.tz

s.dt.freq

s.dt.to_period

s.dt.to_pydatetime

s.dt.tz_localize

s.dt.tz_convert

s.dt.normalize

s.dt.strftime

s.dt.round

s.dt.floor

s.dt.ceil

s.dt.month_name

s.dt.day_name

s.dt.qyear

s.dt.start_time

s.dt.end_time

s.dt.days

s.dt.seconds

s.dt.microseconds

s.dt.nanoseconds

s.dt.components

s.dt.to_pytimedelta

s.dt.total_seconds

  

# 个别用法举例

s.dt.tz_localize('UTC').dt.tz_convert('US/Eastern')

s.dt.strftime('%Y/%m/%d')

时长数据

时间差

和上面的时间点比起来,时间差就表示一个时间的长度,一天一小时这种时间差。

Timedelta 数据类型用来代表时间增量,两个固定时间相减会产生时差: 

1

2

3

4

5

# 两个固定时间相减

pd.Timestamp('2020-11-01 15') - pd.Timestamp('2020-11-01 14')

# Timedelta('0 days 01:00:00')

pd.Timestamp('2020-11-01 08') - pd.Timestamp('2020-11-02 08')

# Timedelta('-1 days +00:00:00')

按以下格式传入字符串:

1

2

3

4

5

6

7

8

9

# 一天

pd.Timedelta('1 days')

# Timedelta('1 days 00:00:00')

pd.Timedelta('1 days 00:00:00')

# Timedelta('1 days 00:00:00')

pd.Timedelta('1 days 2 hours')

# Timedelta('1 days 02:00:00')

pd.Timedelta('-1 days 2 min 3us')

# Timedelta('-2 days +23:57:59.999997'

1

2

3

4

5

6

7

8

用关键字参数指定时间:

pd.Timedelta(days=5, seconds=10)

# Timedelta('5 days 00:00:10')

pd.Timedelta(minutes=3, seconds=2)

# Timedelta('0 days 00:03:02')

 

# 可以实现指定分钟有多少天,多少小时

pd.Timedelta(minutes=3242)

 使用带周期量的偏移量别名:

1

2

3

4

5

6

7

8

# 一天

pd.Timedelta('1D')

# Timedelta('1 days 00:00:00')

# 两周

pd.Timedelta('2W')

# Timedelta('14 days 00:00:00')

# 一天2小时3分钟4秒

pd.Timedelta('1D2H3M4S')

带单位的整型数字:

1

2

3

4

5

6

7

8

# 一天

pd.Timedelta(1, unit='d')

# 100 秒

pd.Timedelta(100, unit='s')

# Timedelta('0 days 00:01:40')

# 4 周

pd.Timedelta(4, unit='w')

# Timedelta('28 days 00:00:00')

Python内置的datetime.timedelta或者Numpy的np.timedelta64:

1

2

3

4

5

6

7

# 一天10分钟

pd.Timedelta(datetime.timedelta(days=1, minutes=10))

# Timedelta('1 days 00:10:00')

  

# 100纳秒

pd.Timedelta(np.timedelta64(100, 'ns'))

# Timedelta('0 days 00:00:00.000000100')

负值 

1

2

3

4

5

6

7

8

9

10

# 负值

pd.Timedelta('-1min')

# Timedelta('-1 days +23:59:00')

  

# 空值,缺失值

pd.Timedelta('nan')

# NaT

  

# pd.Timedelta('nat')

# NaT

也可以用 DateOffsets (Day, Hour, Minute, Second, Milli, Micro, Nano) 来构建:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

pd.Timedelta(pd.offsets.Second(2))

# Timedelta('0 days 00:00:02')

  

#to_timedelta,可以直接生成单个时长数据:

pd.to_timedelta('1 days 06:05:01.00003')

# Timedelta('1 days 06:05:01.000030')

pd.to_timedelta('15.5us')

# Timedelta('0 days 00:00:00.000015')

  

pd.to_timedelta(pd.offsets.Day(3))

# Timedelta('3 days 00:00:00')

  

pd.to_timedelta('15.5min')

# Timedelta('0 days 00:15:30')

  

pd.to_timedelta(124524564574835)

# Timedelta('1 days 10:35:24.564574835')

时长可以相加:

1

2

pd.Timedelta(pd.offsets.Day(2)) + pd.Timedelta(pd.offsets.Second(2)) + pd.Timedelta('00:00:00.000123')

# Timedelta('2 days 00:00:02.000123')

以下是一些操作示例:

1

2

3

4

s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))

td = pd.Series([pd.Timedelta(days=i) for i in range(3)])

df = pd.DataFrame({'A': s, 'B': td})

df

1

2

df['C'] = df['A'] + df['B']

df

1

df.dtypes

时长属性

1

2

3

4

tdt=pd.Timedelta('10 days 9 min 3 sec')

tdt.days

tdt.seconds

tdt.value #(时间戳)

原文链接:https://blog.csdn.net/weixin_46277779/article/details/126268957
相关文章
最新更新