我有一个df超过数亿行的数据。
latitude longitude time VAL
0 -39.20000076293945312500 140.80000305175781250000 1972-01-19 13:00:00 1.20000004768371582031
1 -39.20000076293945312500 140.80000305175781250000 1972-01-20 13:00:00 0.89999997615814208984
2 -39.20000076293945312500 140.80000305175781250000 1972-01-21 13:00:00 1.50000000000000000000
3 -39.20000076293945312500 140.80000305175781250000 1972-01-22 13:00:00 1.60000002384185791016
4 -39.20000076293945312500 140.80000305175781250000 1972-01-23 13:00:00 1.20000004768371582031
... ...
Run Code Online (Sandbox Code Playgroud)
它包含一个time类型为datetime64UTC的列。下面的代码是创建一个新列isInDST来指示time本地时区是否处于夏令时。
df['isInDST'] = pd.DatetimeIndex(df['time']).tz_localize('UTC').tz_convert('Australia/Victoria').map(lambda x : x.dst().total_seconds()!=0)
Run Code Online (Sandbox Code Playgroud)
处理 15,223,160 行大约需要 400 秒。
有没有更好的方法以更好的性能实现这一目标?是vectorize一个更好的办法?
我正在查看每天24小时工作的工厂的班次数据.我想在每次班次变更时对数据进行分组,即6:00和18:00.到目前为止,我一直在尝试:
Data_Frame.groupby([pd.Grouper(freq='12H')]).count()
Run Code Online (Sandbox Code Playgroud)
但是我已经意识到,由于频率设置为12H,它总是需要12个小时,包括夏令时.
不幸的是,即使时钟发生变化,它总是在6:00和18:00.这意味着实际上一年中有一个时间长度为11个小时,另一个时间长度为13个小时,因此在年中组中有1个小时.
我觉得这是一个基本的东西(夏令时),应该有一些方法告诉大熊猫它需要考虑夏令时.
我已经尝试将它从UTC改为欧洲/伦敦,但它仍需要12个小时的时间.
非常感谢
编辑:
我发现这样做的唯一方法就是,在使用groupby之前将数据拆分为3(在第一个小时更改之前,在小时更改之前,第二个小时更改之前),逐个使用groupby然后将它们重新组合在一起,但这很烦人且乏味所以比这更好的东西是非常感激的.
我有一个带有 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)
Run Code Online (Sandbox Code Playgroud)
我想创建一个带有 0/1 指标列的列,夏季为 1,冬季为 0,但我找不到相关的 dst / is_dst 属性,即我想要类似的东西
df['is_dst'] = df.index.is_dst()
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议正确的方法/属性是。或者我是否需要转换到不同的“日期时间”课程?
我需要一些通用的东西——即适用于任何时区,包括没有夏令时的“澳大利亚/布里斯班”。我宁愿不必解析时区偏移量并尝试确定它是夏季/冬季。