# !!!! 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])