时间处理之Python
1 获取当前日期和时间
from datetime import datetime
time_now = datetime.now()
print(time_now) # 直接打印会比较规整
time_now
2019-05-06 17:09:14.732634
datetime.datetime(2019, 5, 6, 17, 9, 14, 732634)
2 获取指定日期和时间
dt = datetime(2019, 6, 1, 0, 0, 0)
print(dt)
2019-06-01 00:00:00
3 将datetime转为时间戳timestamp
3.1 方法1
# 转为时间戳
tsmp = dt.timestamp()
tsmp
1559318400.0
3.2 方法2
import time
def time_check(recent_time):
recent_stamp = time.mktime(time.strptime(recent_time, '%Y%m%d%H%M%S'))
return int(recent_stamp)
time_check('20190601000000')
1559318400
3.3 方法2应用
问题:现在有一个DataFrame,我们想要看时间节点在2018年12月17号之前的样本量有多少?该如何去考虑呢?
思路:
- 首先将这一列时间变为时间戳的格式
- 将2018年12月17号变为时间戳
- 筛选小于第2个中的时间戳的DataFrame
3.3.1 原始数据
import pandas as pd
card = pd.read_excel('时间处理/example_data.xlsx')
card = card.iloc[:,:-1]
card = card[card['提现成功']==1]
print(card.shape)
card.head()
(2006, 5)
授信状态 | 首借日期 | 完成申请 | 授信成功 | 提现成功 | |
---|---|---|---|---|---|
4 | 3 | 2018/10/13 | 1 | 1 | 1 |
5 | 3 | 2018/10/27 | 1 | 1 | 1 |
8 | 3 | 2018/9/21 | 1 | 1 | 1 |
9 | 3 | 2018/11/10 | 1 | 1 | 1 |
13 | 3 | 2018/7/16 | 1 | 1 | 1 |
3.3.2 将这一列时间变为时间戳的格式
# 将时间转为时间戳
import time
def time_check(recent_time):
try:
recent_stamp = time.mktime(time.strptime(recent_time, '%Y/%m/%d'))
# 这里的格式需要根据给定数据的情况进行改变
except Exception as e:
print(e)
return int(recent_stamp)
card['ts'] = card['首借日期'].map(time_check)
print(card.shape)
card.head()
(2006, 6)
授信状态 | 首借日期 | 完成申请 | 授信成功 | 提现成功 | ts | |
---|---|---|---|---|---|---|
4 | 3 | 2018/10/13 | 1 | 1 | 1 | 1539360000 |
5 | 3 | 2018/10/27 | 1 | 1 | 1 | 1540569600 |
8 | 3 | 2018/9/21 | 1 | 1 | 1 | 1537459200 |
9 | 3 | 2018/11/10 | 1 | 1 | 1 | 1541779200 |
13 | 3 | 2018/7/16 | 1 | 1 | 1 | 1531670400 |
3.3.3 直接筛选
card2 = card[card['ts'] <= time_check('2018/12/17')]
print(card2.shape)
card2.head()
(1841, 6)
授信状态 | 首借日期 | 完成申请 | 授信成功 | 提现成功 | ts | |
---|---|---|---|---|---|---|
4 | 3 | 2018/10/13 | 1 | 1 | 1 | 1539360000 |
5 | 3 | 2018/10/27 | 1 | 1 | 1 | 1540569600 |
8 | 3 | 2018/9/21 | 1 | 1 | 1 | 1537459200 |
9 | 3 | 2018/11/10 | 1 | 1 | 1 | 1541779200 |
13 | 3 | 2018/7/16 | 1 | 1 | 1 | 1531670400 |
注意:某些编程语言(如Java和JavaScript)的timestamp使用整数表示毫秒数,这种情况下只需要把timestamp除以1000就得到Python的浮点表示方法。
4 从timestamp中提取出月份
4.1 提取函数
def extract_month(time_stamp):
time_tuple = time.localtime(time_stamp)
mon_num = time_tuple.tm_mon
if mon_num<10:
mon_str = '0'+str(mon_num)
else:
mon_str = str(mon_num)
return str(time_tuple.tm_year)+'-'+mon_str
extract_month(time_check('20190202232359'))
'2019-02'
4.2 测试
time_tuple = time.localtime(1549121039)
time_tuple
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=2, tm_hour=23, tm_min=23, tm_sec=59, tm_wday=5, tm_yday=33, tm_isdst=0)
5 从timestamp提取出时段
5.1 函数
def extract_hour(time_stamp):
# 提取时段,每日分为12个时段
time_tuple = time.localtime(time_stamp)
return time_tuple.tm_hour
extract_hour(1549121039)
23
6 从timestamp中提取出天数
除以86400
1549121039 / 86400 + 1
17930.641655092593
# 计算2019年6月1号到现在有多久
from datetime import datetime
dt1 = datetime(2019, 6, 1, 0, 0, 0)
dt2 = time_now
int((dt1.timestamp() - dt2.timestamp()) / 86400) + 1
26
7 timestamp转为datetime
7.1 方法1
ts = datetime.fromtimestamp(tsmp)
print(ts)
ts
2019-06-01 00:00:00
datetime.datetime(2019, 6, 1, 0, 0)
7.2 方法2
'''
上面返回的是本地时间,也就是北京时间,下面返回标准的UTC时间
'''
ts_utc = datetime.utcfromtimestamp(tsmp)
print(ts_utc) # 比北京本地时间要提前8小时
ts_utc
2019-05-31 16:00:00
datetime.datetime(2019, 5, 31, 16, 0)
8 str转为datetime
str_ts = '2019-2-27 23:55:59'
dt_ts = datetime.strptime(str_ts, '%Y-%m-%d %H:%M:%S')
print(dt_ts)
dt_ts
2019-02-27 23:55:59
datetime.datetime(2019, 2, 27, 23, 55, 59)
9 datetime转为str
dt_ts_new = datetime(2022,2,22,22,22,22)
dt_ts_str = datetime.strftime(dt_ts_new, '%Y-%m-%d %H:%M:%S')
dt_ts_str
'2022-02-22 22:22:22'
10 具体时间的相加减
from datetime import datetime
from datetime import timedelta
# 现在要算 2022年2月22号 晚上22点22分 退720天离现在多久?
obj_ts = datetime(2022, 2, 22, 22, 22, 22)
obj_ts - timedelta(days = 720)
datetime.datetime(2020, 3, 4, 22, 22, 22)
obj_ts = datetime(2022, 2, 22, 22, 22, 22)
obj_ts - timedelta(days = 1090)
# 也就是现在还有1090天达到一个特别2的日子
datetime.datetime(2019, 2, 28, 22, 22, 22)
import datetime
datetime.date(year = 2222, month = 2, day = 22)
datetime.date(2222, 2, 22)