2015-03-30 3 views
3

У меня есть dataframe с столбцом TimeStamps. Я хочу преобразовать его в строки местного времени, то есть с летнего времени.python pandas TimeStamps для локальной временной строки с летним временем

Поэтому я хочу преобразовать ts [0] ниже в "2015-03-30 : 55: 05". Кажется, что Pandas знает о DST, но только когда вы вызываете значения в серии.

Благодаря

(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

какой у вас местный часовой пояс (например, 'Европа/Лондон')? Есть ли переход на летнее время на 2015-03-30? – jfs

+0

Привет, да, DST началась в 2015-03-29. Временная метка в UTC правильная, но я не могу найти способ отобразить ее как строку в лондонское время. @ Александр получил это. – jf328

+0

Связанный: [Преобразование временных интервалов с временных интервалов панд] (http://stackoverflow.com/q/25653529/4279) – jfs

ответ

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' 

См pytz или datetime для получения дополнительной информации.

+0

, если 'dt' является модулем' datetime', тогда используйте 'utcnow()' вместо 'now()' здесь , – jfs

+0

Конечно, но нужно показать, как преобразовать локальную метку времени в UTC (пример «сейчас» - это всего лишь пример). Считается лучшей практикой всегда работать в режиме UTC, за исключением случаев отображения. – Alexander

+0

Европа/Лондон часовой пояс! = UTC !!! Не используйте '.now()' (возвращает время в * локальном * часовом поясе), то вы имеете в виду '.utcnow()' (возвращает время в UTC)! – jfs

Смежные вопросы