我有一个带有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”课程?
我需要一些通用的东西-即在任何时区工作,例如说“夏令时”的“澳大利亚/布里斯班”。我不想不必解析时区偏移并尝试确定是夏季还是冬季。
答案 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