python中时间戳(epoch)和日期的相互转换

1 epoch时间转日期

1.1 使用python标准库datetime

方式:datetime.datetime.fromtimestamp(timestamp,tz=None)方法。其中timestamp为浮点数,表示epoch秒数,tz表示时区,默认为None,默认会使用本地时区,把epoch转为本地时间。

1.2 使用pandas

方式1:使用pd.to_datetime()方法,具体的,pd.to_datetime(epoch,unit='s'),需要通过unit参数标明epoch的单位,这里's'表示秒数,默认单位是纳秒ns,转换为0时区下的时间。要注意的是,pd.to_datetime()方法返回的是不带时区的niave的UTC时间。

方式2:使用pd.Timestamp(epoch,unit,tz)。unit默认纳秒,tz默认为0时区。所以该方法得到的时间默认是0时区下的时间,但是返回的时间对象是不带时区的naive时间。

2 日期转epoch时间

2.1 使用python标准库datetime

方式1:将目标日期减去datetime(1970,1,1)得到timedelta,然后使用timedelta对象的total_seconds()即可。这里需要注意的是,如果目标日期是naive的,那么datetime(1970,1,1)也应该是naive的,但如果目标日期是带时区的,那么datetime(1970,1,1,tzinfo=pytz.timezone(tz))应该通过tzinfo参数指定相同的时区,时区对象可以通过pytz标准库得到。

方式2:在python3.3版本开始,可以通过datetime.datetime的timestamp()方法得到秒数。要注意的是,如果datetime对象是naive的,那么该方法会以本地时区进行转化得到epoch,如果是有时区的,便根据相应时区进行转换。

扫描二维码关注公众号,回复: 13114910 查看本文章

2.2 使用pandas

方式:使用pd.Timestamp对象的timestamp()函数得到秒数。其和python标准库不同的是,如果Timestamp对象是不带时区的naive日期,那么转换时是使用0时区进行的,而不是本地时区。

plus: python3.7开始,通过time.time_ns()可以获取当前时刻本地时区对应的纳秒级epoch;pandas的Timestamp对象有一个nanosecond属性,可以直接获取纳秒。

最后需要提醒的一点是,不要使用strftime('%s')方式得到epoch时间,有两点原因:一是该方式在windows下不支持,在unix下支持,因为实际上python本身不支持%s格式化方式,在unix下可以work的原因在于python将%s信息传给了unix系统,使用的是unix的%s格式化方式;所以这样造成跨平台的兼容性问题。二是时区问题,通过一的解释,实际上在Unix下strftime('%s')是通过系统本身的格式化方式得到的,因此使用了系统的时间和时区信息,因此strftime('%s')在unix返回的是本地时区下该时间的epoch时间,而不是naive的该时间对应的epoch时间。

猜你喜欢

转载自blog.csdn.net/S_o_l_o_n/article/details/110454949