datetime64与unix时间戳互转
在用pandas处理数据时,经常要处理一些时间类型数据,经常把pandas时间类型与datetime模块,还有python自带的time模块搞混淆,记录之。
unix 时间戳与pandas中的Timestamp互转
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import time def unixToTime(unixtime): return pd.to_datetime(unixtime,unit = 's' ,utc = True ).tz_convert( 'Asia/Shanghai' ) #utc时间比上海时间少8小时,做时区转换 def timeToUnix(dt64): return dt64.astype( 'datetime64[s]' ).astype( 'int' ) unixtime = 1514737265 print (unixToTime(unixtime)) #python 自带time模块的local_time可以直接转北京时间 struct_time = time.localtime(unixtime) print (struct_time) #转化格式 dd = time.strftime( "%Y-%m-%d %H:%M:%S" ,struct_time) print (dd) |
输出:
2018-01-01 00:21:05+08:00
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=21, tm_sec=5, tm_wday=0, tm_yday=1, tm_isdst=0)
2018-01-01 00:21:05
datetime模块
python中还有一个datetime模块,这个模块包含一些函数,如today,now,fromtimestamp,strptime,Datetime
1
2
3
4
5
6
7
8
9
10
11
|
from datetime import datetime import pandas as pd startTime = datetime.now() print (startTime) print ( type (startTime)) #datetime 字符串转时间戳 timestr = '2018-01-01 00:21:05' date_time = datetime.strptime(timestr, "%Y-%m-%d %H:%M:%S" ) print ( type (date_time)) print (date_time) |
输出:
2020-12-16 22:22:42.451086
<class 'datetime.datetime'>
1
2
3
4
5
6
7
8
9
|
#pandas 字符串转时间戳 pd_time = pd.to_datetime(time, format = "%Y-%m-%d %H:%M:%S" ) #或者 #time = datetime(2018,1,1,0,21,5) #pd_time = pd.to_datetime(timestr,format="YYYY-MM-DD HH:MM:SS") print ( type (pd_time)) print (pd_time) |
输出:
<class 'datetime.datetime'>
2018-01-01 00:21:05
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#取到年,月,日,日期,小时,分钟,秒以及一周中的第几天 year = pd_time.year month = pd_time.month day = pd_time.day date = pd_time.date hour = pd_time.hour minute = pd_time.minute seconds = pd_time.second print (year) print (month) print (day) print (hour) print (minute) print (seconds) |
输出:
2018
1
1
0
21
5
pandas默认时间格式转换为unix间戳
Pandas读取csv文件时,时间会自动显示为‘YYYY-MM-DD HH:MM:SS’的格式,那么如果想要将这个时间转换为 Unix时间戳 呢?
先科普一下,什么是 Unix时间戳 呢?
Unix时间戳 是一种时间表示方式,是一个整型值,代表从格林威治时间1970年01月01日00时00分00秒起至现在经过的总秒数。
举个栗子
一个值为 1492751843 的Unix时间戳 ==>
把它转换为 北京时间为 2017/4/21 13:17:23
实际上,Pandas中时间用 pandas.datetime() 转换为 pandas.tslib.Timestamp(时间戳) 格式之后,已经变成了整型存储,即 Unix时间戳形式 。
如果我们需要这个时间戳的整型格式,可以用 time[0].value 这个属性把它提取出来。
样例
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
|
>>> import pandas as pd # 导入pandas库 >>> data = pd.read_csv( 'airquality.csv' ) # 读入数据文件 >>> data.time = pd.to_datetime(data.time) # 将时间那一列从str转换为时间戳格式 >>> type (data.time[ 0 ]) # 查看转换之后的格式 < class 'pandas.tslib.Timestamp' > >>> data.time[ 0 ] # 查看第一条数据,默认显示为‘YYYY-MM-DD HH:MM:SS'格式 Timestamp( '2014-05-01 00:00:00' ) >>> data.time[ 0 ].value # 查看第一条数据的Unix时间戳格式 1398902400000000000L >>> data.time[ 0 ].value / / 10 * * 9 # 转换为秒级 1398902400L >>> t1 = [t.value for t in data.time] # 提取整列(纳秒级,即1s = 1,000,000,000 ns) >>> t1[: 3 ] # 显示前三条数据 [ 1398902400000000000L , 1398906000000000000L , 1398909600000000000L ] >>> t2 = [t.value / / 10 * * 9 for t in data.time] # 提取整列(秒级) >>> t2[: 3 ] # 显示前三条数据 [ 1398902400L , 1398906000L , 1398909600L ] >>> t1 = pd.DatetimeIndex(t1) # 从list列表转换为pandas的DatetimeIndex格式 >>> t1[: 3 ] # 显示前三条数据 DatetimeIndex([ '2014-05-01 00:00:00' , '2014-05-01 01:00:00' , '2014-05-01 02:00:00' ], dtype = 'datetime64[ns]' , freq = None ) >>> type (t1[ 0 ]) # 每条数据为Timestamp格式 < class 'pandas.tslib.Timestamp' > >>> t1[ 0 ].value 1398902400000000000L |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/CCSUXWZ/article/details/111303823