【问题标题】:looking for Pandas.DateTimeIndex.is_dst()寻找 Pandas.DateTimeIndex.is_dst()
【发布时间】:2019-04-16 22:41:56
【问题描述】:

我有一个带有 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()

任何人都可以建议正确的方法/属性是。或者我是否需要转换为不同的“日期时间”类?

我需要一些通用的东西 - 即适用于任何时区,包括说没有夏令时的“澳大利亚/布里斯班”。我宁愿不必解析时区偏移量并尝试确定是夏季/冬季。

【问题讨论】:

标签: python pandas


【解决方案1】:

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

【讨论】:

  • 我真的必须在这里使用lambda 映射吗?不应该有一个更简单的选择吗?df['datetime'].dt.is_dst
【解决方案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 设置为 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、非零或某个非零值,则构造函数将简单地 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

【讨论】:

  • 它有熊猫的方法:-)
猜你喜欢
  • 2011-02-19
  • 2022-01-23
  • 2011-02-23
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
相关资源
最近更新 更多