Python中的时间格式(2):速查版

前面花时间整理了一下Python中时间格式的几个基础模块的用法,主要是针对时间格式的表达及转换。不过发现有些冗余不好找,因此整一个速查的版本方便自己快速复制粘贴

一般只用datetime这个库即可

1
2
3
from datetime import datetime, date, hour
from datetime import timedelta
import pandas as pd

常规时间格式处理

转换,将根据字符串的模式匹配并生成时间格式

时间格式之后就可以按照自己的要求进行转换

1
2
3
4
5
6
7
8
9
10
# 字符串转时间
dt = datetime.strptime("21/11/06 16:30:00", "%d/%m/%y %H:%M:%S")
dt = datetime.strptime("21/11/06 16", "%d/%m/%y %H")
year,month, udate = dt.year, dt.month, dt.date()
# 时间转字符串
t_str = dt.strftime("%Y-%m-%d %H:%M:%S")
t_str = dt.strftime("%Y-%m-%d %H")
t_str = dt.strftime("%Y/%m/%d")
# 时间加减,如加时区
time_bj = time_utc+ timedelta(hours=8)

pandas时间序列处理

建议是写出文件的时候转成字符串,在读取处理的时候则使用datetime格式便于计算和绘图等等

时间格式转换

1
2
3
4
5
6
7
# 导入时即转换
df = pd.read_csv(filepath, parse_dates=['time','date'], encoding = 'utf-8')
# 如果原始数据为字符串则字符串转换为时间
df['time']=pd.to_datetime(df['time_str'].astype(str), format='%Y/%m/%d')
# 如果是时间格式转为字符串
df['time_str']=df['time'].astype(str)
df['time_str'] = df['time'].dt.strftime('%m-%d-%Y')

时间序列的拆分合并,注意是字符串还是时间格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 合并
df = pd.DataFrame({'year': [2015, 2016],'month': [2, 3],'day': [4, 5],'hour':[10,20]})
# 不一致需要改名再合并,比如
# df.rename(columns = {'Year':'year','Mon':'month','Day':'day'}, inplace=True)
df['date'] = pd.to_datetime(df[['year','month','day']])
df['datetime'] = pd.to_datetime(df.date) + pd.to_timedelta(df.hour, unit='h')

#拆分/转换示例,time为时间格式,strftime转换之后的类型为字符串格式
df['date'] = df['time'].dt.strftime('%Y-%m-%d')
df['month'] = df['time'].dt.strftime('%m')
df['day'] = df['time'].dt.strftime('%d')
df['hour'] = df['time'].dt.strftime('%H')
df['date'] = df['time'].dt.strftime('%x')
# 如果需要得到时间格式的结果,加astype()或者pd.to_datetime()
df['date'] = df['time'].dt.strftime('%Y-%m-%d').astype('datetime64')
df['date'] = pd.to_datetime(df_grid['time'].dt.strftime('%Y-%m-%d'))
df['month'] = df['time'].dt.strftime('%m').astype('int')
df['day'] = df['time'].dt.strftime('%d').astype('int')
df['hour'] = df['time'].dt.strftime('%H').astype('int')

时间序列范围筛选

1
2
3
4
5
# df['time']为时间格式:
df2 = df.loc[(df.time > pd.datetime(2017,8,23,5)) & (df.time <= pd.datetime(2017,8,27,23))]
df2 = df.loc[(df.time < pd.datetime(2017,8,23,6)) | (df.time > pd.datetime(2017,8,27,0))]
# df['time']为字符串:
df2 = df.loc[(df.time > '2017-08-20 00:00:00') & (df.time < '2017-08-26 00:00:00')]

创建序列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建序列, 可以直接接收
# 默认都是ISO 8601 格式 YYYY-MM-DD, '2018-01-01 03:00:00'
df['time'] = pd.date_range(start='1/1/2018', end='1/08/2018', freq='D') #8天
pd.date_range(start='1/1/2018', end='1/08/2018') #8天
pd.date_range(start='1/1/2018', periods=8) #8天
pd.date_range(start='1/1/2018', periods=8, freq='2M') #8天,两天之间间隔为两个月
pd.date_range(start='2018-01-01', end='2018-02-01', freq='3H')
pd.date_range(start='2017-01-01', end='2018-01-01', closed='left') #创建指定月份的日期范围pandas<1.4版本,参数名为closed, pandas>1.4版本为inclusive

# 创建一月份的时间数据,按天,按小时
pd.date_range(start='2017-01-01', end='2017-02-01', inclusive='left')
#创建指定月份的日期范围
pd.date_range(start='2017-01-01', end='2017-02-01', inclusive='left', freq='H')

#创建序列后转字符串列表['2020-07-17', '2020-07-18', '2020-07-19', '2020-07-20', '2020-07-21']
pd.date_range(start='2020-07-17', end='2020-07-21',freq='D').strftime("%Y-%m-%d").to_list()

计算脚本时长

对于python .py脚本

1
2
3
4
5
import time
start_time = time.time()
main()
seconds = time.time() - start_time
print('Time Taken:', time.strftime("%H:%M:%S",time.gmtime(seconds)))

对于jupyter notebook/lab, 运行单元格加一行,如果是vscode则不需要

1
2
%%time
you process codes...