【发布时间】:2019-11-29 09:54:17
【问题描述】:
我希望虽然这看起来很复杂,但有人已经解决了类似的问题,因为它本质上是处理夏令时。
我有一些记录温度的设备。一些探测器以 GMT/UTC 记录时间,而其他探测器以 BST/时钟记录时间。
探头每小时记录一次温度数据,因此对于记录 GMT/UTC 数据的探头,数据有 24 列,其中第 0 列对应一年中的每天 00:00,第 1 列到 01:00 等。
在英国,时钟在 3 月的最后一个星期日凌晨 1 点向前走 1 小时,在 10 月的最后一个星期日凌晨 2 点向后走 1 小时。
对于以 BST/Clock 时间记录数据的探针,当时钟前进时,只有 23 个小时周期的数据,而不是正常的 24 个。当时钟回退时,有 25 个小时周期而不是 24 个。
问题分为三个部分。第一个是我想以 GMT/UTC 格式标准化一个数据帧中的数据,所以在时钟前进的那一天,我有 23 个读数,我需要将第二天/行的第一列中的读数移动到列前一天24日。然后我需要继续移动所有列数据,向左移动一个位置。我需要重复这个过程,将一行的第一列移动到前一行的最后一列,然后将该行中的所有其他列移动到 1 个位置,直到 10 月的最后一个星期日,其中有 25 个读数。这是我想要实现的一个示例:
# BST/Clock Data Format
bst = [{0:9, 1:6, 2:7, 3:4, 22:2, 23:1},
{0:10, 1:12, 2:9, 3:8, 22:16},
{0:11, 1:9, 2:8, 3:12, 22:15, 23:16},
{0:1, 1:6, 2:5, 3:7, 22:6, 23:8, 24:9},
{0:2, 1:2, 2:4, 3:4, 22:3, 23:2}]
# Create BST/Clock df
df_bst = pd.DataFrame(bst, index=['24/03/2018', '25/03/2018', '26/03/2018', '28/10/2018', '29/10/2018'])
df_bst.index = pd.to_datetime(df_bst.index, dayfirst=True)
# Format of what GMT/UTC data should look like
gmt = [{0:9, 1:6, 2:7, 3:4, 22:2, 23:1},
{0:10, 1:12, 2:9, 3:8, 22:16, 23:11},
{0:9, 1:8, 2:12, 3:15, 22:16, 23:5},
{0:6, 1:5, 2:7, 3:6, 22:8, 23:9},
{0:2, 1:2, 2:4, 3:4, 22:3, 23:2}]
df_gmt = pd.DataFrame(gmt, index=['24/03/2018', '25/03/2018', '26/03/2018', '28/10/2018', '29/10/2018'])
df_gmt.index = pd.to_datetime(df_gmt.index, dayfirst=True)
print('Initial format')
print(df_bst)
print()
print('What data should look like after translation with the last Sunday in Mar 2018 and Oct 2018 being 25/03/2018 and 28/10/2018 respectively')
print(df_gmt)
第二部分是我想为数据框中的数据计算 3 月和 10 月的最后一个星期日。我正在研究类似的东西:
for month in (3, 10):
last_sunday = max([week[-1] for week in calendar.monthcalendar(2018, month)])
x = datetime.datetime(2018, month, last_sunday)
print(x.strftime('%d/%m/%Y'))
并使用 DatetimeIndex.year 提取年份,但有时它们的数据集跨越一年以上,因此我需要在 31/03/2018 - 28/10/2018 之间应用转换,然后在 31 之间再次应用/03/2019 - 今天。
问题的最后一部分是偶尔我想报告 14:00 BST/Clock - 18:00 BST/Clock 之间的平均温度。鉴于我的数据存储在 GMT/UTC 中,最好的方法是什么?
我尝试了不同的选项,包括本地化,但无济于事。
【问题讨论】:
标签: python pandas dataframe datetime dst