2015-03-30 27 views
3

我有一个带有TimeStamps列的数据框。我想将它转换为当地时间的字符串,即夏令时。python熊猫TimeStamps到夏令时的本地时间字符串

所以我想将下面的ts [0]转换为“2015-03-30 :55:05”。熊猫似乎意识到DST,但只有当你在系列中调用.values时。

感谢

(Pdb) ts = df['TimeStamps'] 
(Pdb) ts 
0 2015-03-30 02:55:05.993000 
1 2015-03-30 03:10:20.937000 
2 2015-03-30 10:09:19.947000 
Name: TimeStamps, dtype: datetime64[ns] 
(Pdb) ts[0] 
Timestamp('2015-03-30 02:55:05.993000') 
(Pdb) ts.values 
array(['2015-03-30T03:55:05.993000000+0100', 
    '2015-03-30T04:10:20.937000000+0100', 
    '2015-03-30T11:09:19.947000000+0100'], dtype='datetime64[ns]') 
+0

你当地的时区是什么(例如'Europe/London')? 2015-03-30有没有DST转换? – jfs 2015-03-31 08:49:19

+0

嗨,是的,DST于2015-03-29开始。 UTC中的时间戳是正确的,但我无法在伦敦时间找到将其显示为字符串的方式。 @Alexander明白了。 – jf328 2015-03-31 10:57:06

+0

相关:[从熊猫时间戳转换时区](http://stackoverflow.com/q/25653529/4279) – jfs 2015-03-31 22:25:13

回答

9

DST是相对于你的位置(例如伦敦纽约DST开始后的几个星期)。首先,您需要做的时间戳时区意识到:

from pytz import UTC 
from pytz import timezone 
import datetime as dt 

ts = pd.Timestamp(datetime.datetime(2015, 3, 31, 15, 47, 25, 901597)) 
# or... 
ts = pd.Timestamp('2015-03-31 15:47:25.901597') 
# ts is a Timestamp, but it has no idea where in the world it is... 
>>> ts.tzinfo is None 
True 

# So the timestamp needs to be localized. Assuming it was originally a UTC timestamp, it can be localized to UTC. 
ts_utc = ts.tz_localize(UTC) 
# Once localized, it can be expressed in other timezone regions, e.g.: 
eastern = pytz.timezone('US/Eastern') 
ts_eastern = ts_utc.astimezone(eastern) 
# And to convert it to an ISO string of local time (e.g. eastern): 
>>> ts_eastern.isoformat() 
'2015-03-30T08:09:27.143173-04:00' 

有关更多信息,请参见pytzdatetime

+0

如果'dt'是'datetime'模块,则在此使用'utcnow()'代替'now()' 。 – jfs 2015-03-31 22:21:37

+0

当然,但重点是展示如何将本地时间戳转换为UTC('现在'实例只​​是一个示例)。除了显示时以外,始终处理UTC时间被认为是最佳做法。 – Alexander 2015-03-31 22:43:07

+0

欧洲/伦敦时区!= UTC !!!不要使用'.now()'(返回* local * timezone中的时间),那么你的意思是'.utcnow()'(以UTC来返回时间)! – jfs 2015-03-31 22:43:56