python - 过渡周期间 Pandas DataFrame 夏令时调整错误?

标签 python pandas dataframe

我在 CSV 文件中有一个数据集,我正在将其加载到 Pandas DataFrame 中以按日期 + 时间进行索引。原始数据是纽约时间(虽然没有体现在原始数据上),我需要从伦敦时间的角度来分析。

在将索引加载到 DataFrame 之后,我为 EST TimeZone 创建了 TimeZone-aware 索引,然后将其转换为 Europe/London TimeZone。它似乎工作正常,但不适用于过渡期的日期,在此期间伦敦和纽约之间的时差为 4 小时,而不是 5 小时(就像现在,在 3 月下旬)。

CSV 文件中的数据如下所示:

2/15/16 10:00   1
2/15/16 10:01   2
3/24/16 10:00   3
3/24/16 10:01   4
3/24/16 10:02   5
3/24/16 10:03   6
3/24/16 11:00   7
3/24/16 11:01   8

这里是简化的代码:

import datetime
import pandas as pd

df = pd.read_csv('data/dates.csv', usecols=[0, 1, 2], header=None)
df.columns = ['dt', 'tm', 'val']
df.set_index(pd.DatetimeIndex(df.dt + ' ' + df.tm), inplace=True)
del df['dt']
del df['tm']
print(df)
df.index = df.index.tz_localize('EST', ambiguous='infer').tz_convert('Europe/London')
print(df)

第一个 print() 语句的输出如下:

                    val
2016-02-15 10:00:00    1
2016-02-15 10:01:00    2
2016-03-24 10:00:00    3
2016-03-24 10:01:00    4
2016-03-24 10:02:00    5
2016-03-24 10:03:00    6
2016-03-24 11:00:00    7
2016-03-24 11:01:00    8

第二个print()的输出如下:

                         val
2016-02-15 15:00:00+00:00    1
2016-02-15 15:01:00+00:00    2
2016-03-24 15:00:00+00:00    3
2016-03-24 15:01:00+00:00    4
2016-03-24 15:02:00+00:00    5
2016-03-24 15:03:00+00:00    6
2016-03-24 16:00:00+00:00    7
2016-03-24 16:01:00+00:00    8

我的问题是,虽然正常的 +5 小时调整在 2016 年 2 月 15 日正确完成,但在 2016 年 3 月 24 日却没有正确完成,因为该日期属于过渡期,此时 NYC-LDN 时差为4 小时,而不是 5 小时。

我已经阅读了很多关于如何正确调整的帖子,并希望 ambiguous='infer' 位可能有所帮助,但似乎我还是做错了?

最后,如果上述难以实现,我不介意进行手动变通。我最终需要做的是根据小时和分钟(从伦敦时间的角度),将 DataFrame 的子集选择到另一个 DataFrame 中。我目前正在这样做:

dfSelected = df[(df.index.time >= datetime.time(15, 1))][['val']]

我正在考虑尝试像这样的手动和丑陋的东西:

shortWnd = [datetime.date(2016, 3, 24), datetime.date(2016, 3, 23)] # etc....
dfSelected = df[(df.index.time >= datetime.time(15, 1) if (df.index.date in shortWnd) else (df.index.time >= datetime.time(14, 1)  ))][['val']]

我正在根据源 DataFrame 中的每一行是否在过渡期内手动调整选择窗口,但我收到此错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

关于如何做得更好的任何想法?!

最佳答案

您需要使用美国/东部时区。 EST(东部标准时间)不考虑 DST。

In [47]: pd.Timestamp('20160315').tz_localize('EST')
Out[47]: Timestamp('2016-03-15 00:00:00-0500', tz='EST')

In [48]: pd.Timestamp('20160315').tz_localize('US/Eastern')
Out[48]: Timestamp('2016-03-15 00:00:00-0400', tz='US/Eastern')

In [29]: df = pd.read_csv(StringIO(data), header=None, sep='\s+', parse_dates=[[0, 1]])

In [30]: df.columns = ['date', 'value']

In [31]: df
Out[31]: 
                 date  value
0 2016-02-15 10:00:00      1
1 2016-02-15 10:01:00      2
2 2016-03-24 10:00:00      3
3 2016-03-24 10:01:00      4
4 2016-03-24 10:02:00      5
5 2016-03-24 10:03:00      6
6 2016-03-24 11:00:00      7
7 2016-03-24 11:01:00      8

In [32]: df['date_tz'] = df['date'].dt.tz_localize('US/Eastern').dt.tz_convert('Europe/London')

In [33]: df['date_tz2'] = df['date'].dt.tz_localize('EST').dt.tz_convert('Europe/London')

In [34]: df
Out[34]: 
                 date  value                   date_tz                  date_tz2
0 2016-02-15 10:00:00      1 2016-02-15 15:00:00+00:00 2016-02-15 15:00:00+00:00
1 2016-02-15 10:01:00      2 2016-02-15 15:01:00+00:00 2016-02-15 15:01:00+00:00
2 2016-03-24 10:00:00      3 2016-03-24 14:00:00+00:00 2016-03-24 15:00:00+00:00
3 2016-03-24 10:01:00      4 2016-03-24 14:01:00+00:00 2016-03-24 15:01:00+00:00
4 2016-03-24 10:02:00      5 2016-03-24 14:02:00+00:00 2016-03-24 15:02:00+00:00
5 2016-03-24 10:03:00      6 2016-03-24 14:03:00+00:00 2016-03-24 15:03:00+00:00
6 2016-03-24 11:00:00      7 2016-03-24 15:00:00+00:00 2016-03-24 16:00:00+00:00
7 2016-03-24 11:01:00      8 2016-03-24 15:01:00+00:00 2016-03-24 16:01:00+00:00

关于python - 过渡周期间 Pandas DataFrame 夏令时调整错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42924424/

相关文章:

python - 更新用 imshow()、contour() 和 quiver() 制作的图形

python - 如何重构数据框以根据 Column[se] 值创建新的列标签,然后使用 Column[value] 值填充这些新列

r - 根据另一列中的常见值聚合 R 中列值的所有可能组合

python - 通过应用来自第二个数据框的规则来改变数据框

python - 估算器管道的参数丢失无效

Python,namedtuple,扩展了基本零件库存系统

python - 对值基于其他列的列进行编码

python - 如何正确地将小时数添加到 pandas.tseries.index.DatetimeIndex?

python - 如何从 Pandas 数据框中获取特定行)?

python - 重命名 pandas 数据框的列名称未按预期工作 - python