ищу Pandas.DateTimeIndex.is_dst () - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть DateFrame с DateTimeIndex, т.е.

import pandas as pd
dates = pd.date_range('2018-04-01', periods=96, freq='15T', tz='Australia/Sydney', name='timestamp')
df = dates.to_frame(index=False)
df.set_index(dates.name, inplace=True)

Я хочу создать столбец со столбцом индикатора 0/1, который равен 1 летом и 0 зимой, но я не могу найти соответствующий атрибут dst / is_dst, т.е. я хочу что-то вроде

df['is_dst'] = df.index.is_dst()

Может кто-нибудь сообщить, что правильный метод / свойство. Или мне нужно перейти в другой класс 'datetime'?

Мне нужно что-то общее - то есть работать для любого часового пояса, включая, скажем, «Австралия / Брисбен», в котором нет летнего времени. Я бы предпочел не анализировать смещение часового пояса и попытаться определить, лето это или зима.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Имеется в pandas

df.index.map(lambda x : x.dst())

После небольшого изменения можно получить логическое значение

df.index.map(lambda x : int(x.dst().total_seconds()!=0))
Out[104]: 
Int64Index([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0],
           dtype='int64', name='timestamp')
0 голосов
/ 14 ноября 2018

Я предполагаю, что метод Вена может быть немного быстрее, но вот способ работы с базовыми объектами Python datetime с атрибутом isdst из datetime.timetuple:

>>> is_dst = [x.timetuple().tm_isdst for x in df.index.to_pydatetime()]
>>> pd.Series(is_dst).head()
0    1
1    1
2    1
3    1
4    1
dtype: int64
>>> pd.Series(is_dst).tail()
91    0
92    0
93    0
94    0
95    0
dtype: int64

Пример для одного значения:

.timetuple() возвращает time.struct_time;

Флаг tm_isdst результата устанавливается в соответствии с методом dst (): tzinfo равен None или dst () возвращает None, tm_isdst устанавливается в -1; иначе, если dst () возвращает ненулевое значение, tm_isdst устанавливается в 1; иначе tm_isdst имеет значение 0.

>>> df.index[0].to_pydatetime().timetuple()
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=91, tm_isdst=1)

Конструктор просто проверит , если атрибут .dst() даты имеет значение None, ненулевое или какое-либо ненулевое значение:

    def timetuple(self):
        "Return local time tuple compatible with time.localtime()."
        dst = self.dst()
        if dst is None:
            dst = -1
        elif dst:
            dst = 1
        else:
            dst = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...