寻找Pandas.DateTimeIndex.is_dst()

时间:2018-11-14 02:06:30

标签: python pandas

我有一个带有DateTimeIndex的DateFrame,即

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 :(得分:4)

它在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')

答案 1 :(得分:2)

我猜测Wen的方法可能会更快一些,但是这是一种使用isdst attribute from datetime.timetuple处理基础Python datetime对象的方法:

>>> 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

  

根据dst()方法设置结果的tm_isdst标志:tzinfo为None或dst()返回None,tm_isdst设置为-1;否则,如果dst()返回非零值,则tm_isdst设置为1;否则,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()属性为“无”,非零或某个非零值,则构造函数将简单地check

    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