2017-09-13 222 views
2

我想将时间(字符串)转换为unix时间戳,然后将其转换回可读的日期时间,但是,有7个小时不同。我的python代码有什么问题?通过python pandas转换Unix时间戳

import datetime 

#Convert a Datetime String to unix timestamp 
def get_Timestamp_from_String(datetimeStr):  

    timestamp = int(datetime.datetime.strptime(datetimeStr, '%Y-%m-%d %H:%M:%S').timestamp())*1000 

    return timestamp 


# Convert unix timestamp to DateTime  
def get_Datetime_from_Timestamp(timestamp): 

    dt = pd.to_datetime(timestamp, unit='ms') 

    return dt 

测试日期时间:“2016年4月1日1时10分04秒”,但是,如果我把它转换回来,然后我得到的结果是:“2016年4月1日8点10分04秒” ,有7个小时不同

timestamp = get_Timestamp_from_String("2016-04-01 01:10:04") 
res = get_Datetime_from_Timestamp(timestamp) 
print(res) 

>>>Timestamp('2016-04-01 08:10:04') 

我的代码中有什么问题?

+0

T imezone问题? – IanS

+0

@Ians我觉得很奇怪,我没有在两个函数中给出任何时区,所以默认的时区应该被应用。 – xirururu

回答

2

我想你需要to_datetime两次,MS除以10**6

datetimeStr = '2016-04-01 01:10:04' 
timestamp = pd.to_datetime(datetimeStr).value //10**6 
print (timestamp) 
1459473004000 

dt = pd.to_datetime(timestamp, unit='ms') 
print (dt) 
2016-04-01 01:10:04 

对于ns,在numpy分时间戳的本机格式是没有必要的:

datetimeStr = '2016-04-01 01:10:04' 
timestamp = pd.to_datetime(datetimeStr).value 
print (timestamp) 
1459473004000000000 

dt = pd.to_datetime(timestamp, unit='ns') 
print (dt) 
2016-04-01 01:10:04 

但是,如果存在时区信息:

datetimeStr = '2016-04-01 01:10:04-07:00' 
timestamp = pd.to_datetime(datetimeStr).value //10**6 
print (timestamp) 
1459498204000 

dt = pd.to_datetime(timestamp, unit='ms') 
print (dt) 
2016-04-01 08:10:04 
+0

'dt' * ......不是df –

+0

@jezrael,非常感谢您的回答。但是,我认为,这很奇怪,来自'pd.to_datetime(...)'的结果与'datetime.datetime.strptime(...)'不同,我无法理解它...... – xirururu

+0

硬问题 - 但我认为熊猫'to_datetime'更普遍。 – jezrael