【发布时间】:2021-07-03 20:23:19
【问题描述】:
我有一个 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
... ...
它包含一个 time 列,其类型为 UTC 中的 datetime64。以下代码是创建一个新列isInDST 来指示time 是否处于本地时区的夏令时。
df['isInDST'] = pd.DatetimeIndex(df['time']).tz_localize('UTC').tz_convert('Australia/Victoria').map(lambda x : x.dst().total_seconds()!=0)
处理 15,223,160 行大约需要 400 秒。
有没有更好的方法以更好的性能实现这一目标? vectorize 是不是更好?
【问题讨论】:
-
你可以试试
df['isInDST'] = [x.dst().total_seconds()!=0 for x in pd.DatetimeIndex(df['time']).tz_localize('UTC').tz_convert('Australia/Victoria')] -
感谢@AmitVikramSingh。您的代码需要 810 秒来处理 103,621,920 行。我有 148*244*424680 = 15,336,044,160 条记录。鉴于这是一个线性处理,处理整个数据需要 30 多个小时。
-
也许使用
utcoffset()的东西可能会稍微快一点? -
比较
df['time'].dt.tz_localize('UTC').dt.tz_convert('Australia/Victoria').map(pd.Timestamp.dst) > datetime.timedelta()怎么样?