• Python datetime与timestamp之间的转换


    # !!!! Python 2 datetime.datetime 对象没有timestamp方法!

    在用Python处理datetime和timestamp的转换时发现在时区方面,Python的处理是个大坑。

    因为Python的time是默认localtime输入来处理的,导致脚本在本地运行和在服务器运行会得到不一样的结果。一不注意就会中招。

    R中也会碰到时区的问题,但是R的方法提供了tz选项来指定日期的时区,简化了问题。而Python 中的time.mktime无法对时区进行指定,带来了很多麻烦。查了很久,发现有一个time.timezone的属性,可以根据运行脚本的机器的时间,来灵活处理时区问题。

    以下是datetime与timestamp转换的方法, 输入和输出都以GMT0为准.

     1 from datetime import datetime
     2 import time
     3 
     4 
     5 def timestamp_datetime(ts):
     6     if isinstance(ts, (int, float, str)):
     7         try:
     8             ts = int(ts)
     9         except ValueError:
    10             raise
    11 
    12         if len(str(ts)) == 13:
    13             ts = int(ts / 1000)
    14         if len(str(ts)) != 10:
    15             raise ValueError
    16     else:
    17         raise ValueError()
    18 
    19     return datetime.fromtimestamp(ts)
    20 
    21 
    22 def datetime_timestamp(dt, type='ms'):
    23     if isinstance(dt, str):
    24         try:
    25             if len(dt) == 10:
    26                 dt = datetime.strptime(dt.replace('/', '-'), '%Y-%m-%d')
    27             elif len(dt) == 19:
    28                 dt = datetime.strptime(dt.replace('/', '-'), '%Y-%m-%d %H:%M:%S')
    29             else:
    30                 raise ValueError()
    31         except ValueError as e:
    32             raise ValueError(
    33                 "{0} is not supported datetime format." 
    34                 "dt Format example: 'yyyy-mm-dd' or yyyy-mm-dd HH:MM:SS".format(dt)
    35             )
    36 
    37     if isinstance(dt, time.struct_time):
    38         dt = datetime.strptime(time.stftime('%Y-%m-%d %H:%M:%S', dt), '%Y-%m-%d %H:%M:%S')
    39 
    40     if isinstance(dt, datetime):
    41         if type == 'ms':
    42             ts = int(dt.timestamp()) * 1000
    43         else:
    44             ts = int(dt.timestamp())
    45     else:
    46         raise ValueError(
    47             "dt type not supported. dt Format example: 'yyyy-mm-dd' or yyyy-mm-dd HH:MM:SS"
    48         )
    49     return ts
    50 
    51 
    52 if __name__ == '__main__':
    53     try:
    54         print(datetime_timestamp('2015-01-01 20:20:00', 's'))
    55         print(timestamp_datetime(1420114800))
    56         print(timestamp_datetime(1420114800123))
    57     except Exception as e:
    58         print(e.args[0])

      

  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/oDoraemon/p/6897950.html
Copyright © 2020-2023  润新知