我的理解:
狭义的时间戳是1970-01-01至今的纳秒数,本身其实是个int对象。
广义的时间戳是python中的datetime对象,自带时区信息,不指定时区时,默认是UTC时区。
处理时间戳的时候,时间字符串、datetime对象、int时间戳,这三者之间转换的方向非常的重要,我个人比较容易混淆。
例如
import pandas as pd
time_string='2021-07-13 00:00:00'
time_datetime = pd.to_datetime(time_string)
# Timestamp('2021-07-13 00:00:00')
time_int = time_datetime.value
# 1626134400000000000
我本意是想得到time_string在中国时区(东八区)的时间戳,。但是因为在时间字符串和datetime对象转换过程中没有指定时区,得到的time_int 其实是UTC的时间戳,这个时间戳转换到北京时区其实是2021-07-13 08:00:00
因此,介绍几种带时区的转换方式
1.时间字符串 -> datetime对象 -> int时间戳
import pandas as pd
time_string='2021-07-13 00:00:00'
time_datetime = pd.DatetimeIndex([time_string], tz='Asia/Shanghai')
# DatetimeIndex(['2021-07-13 00:00:00+08:00'], dtype='datetime64[ns, Asia/Shanghai]', freq=None)
time_int = time_datetime .astype(int)
pd.DatetimeIndex可以传入list对象或者pd.Series对象
或
update_date = '2021-07-13'
pd.date_range(f'{update_date} 09:25', f'{update_date} 11:30', freq='3s', tz='Asia/Shanghai',name='datetime')
2.datetime对象 -> 时间字符串
import pandas as pd
pd.DatetimeIndex([time_string], tz='Asia/Shanghai').astype(str)
# 或
pd.DatetimeIndex([time_string], tz='Asia/Shanghai').strftime('%Y-%m-%d')
3.int时间戳 -> datetime对象
# UTC时间'2021-07-13 00:00:00'
pd.DatetimeIndex([1626134400000000000], tz='Asia/Shanghai')
# DatetimeIndex(['2021-07-13 08:00:00+08:00'], dtype='datetime64[ns, Asia/Shanghai]', freq=None)
分割线
2021-10-14新增:
1.time 模块
可使用time模块处理字符串和UTC时间之间的转换
#时间戳转字符串
from time import localtime,strftime
now = 1407694710
local_tuple = localtime(now)
time_format = '%Y-%m-%d %H:%M:%S'
time_str = strftime(time_format,local_tuple)
print(time_str)
#字符串转时间戳
from time import mktime,strptime
time_tuple= strptime(time_str,time_format)
utc_now = mktime(time_tuple)
print(utc_now)
如果一定要使用time模块,那就应该只将它用在UTC和宿主计算机的当地时间进行转换。对于其他类型的转换来说,还是使用datetime比较好
2.datetime模块
如果想将一个地方的时间转换成另一个地方的时间,应该将UTC时间作为中间的桥梁。
#UTC格式时间转计算机本地时间
from datetime import datetime,timezone
now = datetime(2014,8,10,18,18,30)
now_utc = now.replace(tzinfo=timezone.utc)
now_local = now_utc.astimezone()
print(now_local)
#本地时间转UTC格式UNIX时间戳
time_str = '2021-08-10 11:18:30'
now = datetime.strptime(time_str,time_format)
time_tuple = now.timetuple()
utc_now = mktime(time_tuple)
print(utc_now)
#将字符串转成UTC
import pytz
arrival_nyc = '2014-05-01 23:33:24'
nyc_dt_naive = datetime.strptime(arrival_nyc,time_format)
eastern = pytz.timezone('US/Eastern')
nyc_dt = eastern.localize(nyc_dt_naive)
utc_dt = pytz.utc.normalize(nyc_dt.astimezone(pytz.utc))
print(utc_dt)
#把该UTC转旧金山当地时间
pacific = pytz.timezone('US/Pacific')
sf_dt = pacific.normalize(utc_dt.astimezone(pacific))
print(sf_dt)