dataxon

“日期时间数据”作为三大基础数据类型之一,在数据分析中会经常遇到。
本文总结Python中常见的日期时间操作。

日期时间操作会涉及到的工具包:

import datetime
import calendar
import time
import pandas as pd

获取时间

# 当前日期
today = datetime.date.today()

# 当前日期时间
now = datetime.datetime.now()
now_2 = datetime.datetime.today()

print(today)
print(now)
print(now_2)

输出:
2019-12-30
2019-12-30 11:50:14.037643
2019-12-30 11:50:14.037676

时间映射

# 日期
# 获取对应的,年,月,日
print(today.year,today.month,today.day)

输出:
2019 12 30

# 时间对应的:时、分、秒
print(now.hour,now.minute,now.second)

输出:
11 50 14

# 获取对应的周信息
# 返回:年份,第几周,星期几
today.isocalendar()

输出:
(2020, 1, 1)

# 直接获取星期几
today.isoweekday()

输出:
1

# 给定月份,返回当月第一天的星期以及最后一天
calendar.monthrange(2019,9)

输出:
(6, 30)

# 本周第一天
today = datetime.date.today()
today - datetime.timedelta(days=today.weekday()) 
# weekday方法返回的是以星期日为起点的第几天

输出:
datetime.date(2019, 12, 30)

# 本周最后一天
today + datetime.timedelta(days=7-today.isoweekday()) 
# isoweekday方法是我们平常见到的星期几

输出:
datetime.date(2020, 1, 5)

格式转换

字符串转日期

# 字符串转日期
# 默认是转成日期时间格式
# 如果要获得日期,可以在日期时间格式的基础上加.date()

day_str = \'2019-08-01\'
day_time = datetime.datetime.strptime(day_str,\'%Y-%m-%d\')
print(day_time)

day_date = day_time.date()
print(day_date)

输出:
2019-08-01 00:00:00
2019-08-01

time_str = \'2019-08-01 11:01:33\'
time_time = datetime.datetime.strptime(time_str,\'%Y-%m-%d %H:%M:%S\')
print(time_time)

time_date = time_time.date()
print(time_date)

输出:
2019-08-01 11:01:33
2019-08-01

# 其他格式
date_str = \'2019/8/3\'
date_date = datetime.datetime.strptime(date_str,\'%Y/%m/%d\')
print(date_date)

date_str = \'2019.8.3\'
date_date = datetime.datetime.strptime(date_str,\'%Y.%m.%d\')
print(date_date)

输出:
2019-08-03 00:00:00
2019-08-03 00:00:00

日期转字符串

str(today)

输出:
\'2019-12-30\'

str(now)

输出:
\'2019-12-30 11:50:14.037643\'

datetime.datetime.strftime(now,\'%Y-%m-%d\')

输出:
\'2019-12-30\'

datetime.datetime.strftime(now,\'%Y-%m-%d %H:%M:%S\')

输出:
\'2019-12-30 11:50:14\'

unixtime

# 日期时间转unixtime
time.mktime(today.timetuple())

输出:
1577635200.0

time.mktime(now.timetuple())

输出:
1577677814.0

# unix time 转正常日期时间格式
# unix time 是指从1970.1.1起至今的总秒数
# 通常都是10位整数,如果是11位的话,那就是2286年以后的事情了
datetime.datetime.fromtimestamp(10000000000)

输出:
datetime.datetime(2286, 11, 21, 1, 46, 40)

# 如果你看到unix time超过10位数,就意味着后面的单位是毫秒或者更细的颗粒度
# 通常到秒级就可以,这个时候可以截取前10位整数来转化得到对应的日期时间
time_unix = 1577635200.0
datetime.datetime.fromtimestamp(time_unix)

输出:
datetime.datetime(2019, 12, 30, 0, 0)

# unix time 是指从1970.1.1起至今的总秒数
# 不过你会发现直接减出来的秒数和用time.mktime方法得到的会不一样
# 这是因为中国的时区需要偏移8个小时,也就是8*3600s
(today - datetime.date(1970, 1, 1)).total_seconds() - time.mktime(today.timetuple())

输出:
28800.0

28800/3600

输出:
8.0

时间计算

时间偏移

# 使用datetime.timedelta()方法
# timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
# 计算操作符可+可-,后面的时间单位也可正可负

now + datetime.timedelta(days=1)

输出:
datetime.datetime(2019, 12, 31, 10, 29, 51, 213734)

now + datetime.timedelta(days=-1)

输出:
datetime.datetime(2019, 12, 29, 10, 29, 51, 213734)

pandas 生成时间
date_range(start=None, end=None, periods=None, freq=None, tz=None)

  • start : str or datetime-like, optional
    Left bound for generating dates.
  • end : str or datetime-like, optional
    Right bound for generating dates.
  • periods : integer, optional
    Number of periods to generate.
  • freq : str or DateOffset, default \'D\'
    Frequency strings can have multiples, e.g. \'5H\'. See
    :ref:here <timeseries.offset_aliases> for a list of
    frequency aliases.
  • tz : str or tzinfo, optional
# 间隔的频率,可以是天 \'D\'
pd.date_range(start = \'2020-1-1\',freq=\'D\',periods=3)

输出:
DatetimeIndex([\'2020-01-01\', \'2020-01-02\', \'2020-01-03\'], dtype=\'datetime64[ns]\', freq=\'D\')

# 也可以是小时 H
pd.date_range(start = \'2020-1-1\',freq=\'H\',periods=3)

输出:
DatetimeIndex([\'2020-01-01 00:00:00\', \'2020-01-01 01:00:00\', \'2020-01-01 02:00:00\'], dtype=\'datetime64[ns]\', freq=\'H\')

# 可以间隔多天
pd.date_range(start = \'2020-1-1\',freq=\'2D\',periods=3)

输出:
DatetimeIndex([\'2020-01-01\', \'2020-01-03\', \'2020-01-05\'], dtype=\'datetime64[ns]\', freq=\'2D\')

# 也可以间隔多个小时
pd.date_range(start = \'2020-1-1\',freq=\'6H\',periods=3)

输出:
DatetimeIndex([\'2020-01-01 00:00:00\', \'2020-01-01 06:00:00\', \'2020-01-01 12:00:00\'], dtype=\'datetime64[ns]\', freq=\'6H\')

# 还可以混合
pd.date_range(start = \'2020-1-1\',freq=\'2D6H\',periods=3)

输出:
DatetimeIndex([\'2020-01-01 00:00:00\', \'2020-01-03 06:00:00\', \'2020-01-05 12:00:00\'], dtype=\'datetime64[ns]\', freq=\'54H\')

pd.date_range(start = \'2020-1-1\',freq=\'Q\',periods=3)

输出:
DatetimeIndex([\'2020-03-31\', \'2020-06-30\', \'2020-09-30\'], dtype=\'datetime64[ns]\', freq=\'Q-DEC\')

时间差

time_next = now + datetime.timedelta(weeks=3)

time_gap = time_next-now

# 时间差的天数,总秒数
print(time_gap.days,time_gap.total_seconds())

输出:
21 1814400.0

分类:

技术点:

相关文章: