Python 处理带有DST调整的时间数据

Python 处理带有DST调整的时间数据,python,pandas,dataframe,date,datetime,Python,Pandas,Dataframe,Date,Datetime,我有一个5年中每小时的数据集。每个数据点都有一个日期-我想包括一列,指定小时数,即00-01是小时数#1,01-02是小时数#2,依此类推 但是,数据集包括夏季/冬季时间,即,由于将时间设置为一小时,因此三月的某一天有一个空白小时。此外,它还包括一年中的一天,由于冬季时间的推迟,该天包含25个小时 有谁能帮我做一个每天1-24个的专栏,这个专栏仍然是夏天/冬天的时间。我在想一个计数器,它可以连续计算一个日期“到目前为止”发生了多少次 期望输出: Date Year Mon

我有一个5年中每小时的数据集。每个数据点都有一个日期-我想包括一列,指定小时数,即00-01是小时数#1,01-02是小时数#2,依此类推

但是,数据集包括夏季/冬季时间,即,由于将时间设置为一小时,因此三月的某一天有一个空白小时。此外,它还包括一年中的一天,由于冬季时间的推迟,该天包含25个小时

有谁能帮我做一个每天1-24个的专栏,这个专栏仍然是夏天/冬天的时间。我在想一个计数器,它可以连续计算一个日期“到目前为止”发生了多少次

期望输出:

          Date  Year  Month  Day  Weekday  Hour
0   01-01-2015  2015      1    1        4     1
1   01-01-2015  2015      1    1        4     2
2   01-01-2015  2015      1    1        4     3
3   01-01-2015  2015      1    1        4     4
4   01-01-2015  2015      1    1        4     5
5   01-01-2015  2015      1    1        4     6
6   01-01-2015  2015      1    1        4     7
7   01-01-2015  2015      1    1        4     8
8   01-01-2015  2015      1    1        4     9
9   01-01-2015  2015      1    1        4    10
10  01-01-2015  2015      1    1        4    11
11  01-01-2015  2015      1    1        4    12
12  01-01-2015  2015      1    1        4    13
13  01-01-2015  2015      1    1        4    14
14  01-01-2015  2015      1    1        4    15


能否将列转换为datetime,然后从datetime中提取小时

然后去掉0或25小时,让你的一天都有24小时


提示使用datetime将列转换为datetime,然后使用hour函数创建一个新列。

首先,我要删除带有
NaN
值的行,因为这些值来自不存在的小时(DST转换):

现在,您可以根据日期重新计算小时:

# recalculate the hour of day, zero-based
datechange = df['Date'].eq(df['Date'].shift())
df['Hour_New'] = datechange.cumsum() - datechange.cumsum().where(~datechange).ffill()

# df
#          Date  Value  Hour_New
# 0  29-03-2015    1.0       0.0
# 1  29-03-2015    2.0       1.0
# 3  29-03-2015    4.0       2.0
# 4  29-03-2015    5.0       3.0
# 5  25-10-2015    1.0       0.0
# 6  25-10-2015    2.0       1.0
# 7  25-10-2015    3.0       2.0
# 8  25-10-2015    4.0       3.0
# 9  25-10-2015    5.0       4.0
…使您能够计算时区感知日期时间:

zone = 'Europe/Copenhagen'
# begin with date, localized to origin time zone
df['datetime'] = pd.to_datetime(df['Date'], dayfirst=True).dt.tz_localize(zone)
# now add the hour as a timedelta
df['datetime'] += pd.to_timedelta(df['Hour_New'], unit='h')

# df['datetime']
# 0   2015-03-29 00:00:00+01:00
# 1   2015-03-29 01:00:00+01:00
# 3   2015-03-29 03:00:00+02:00 # <-- one hour stolen due to DST transition
# 4   2015-03-29 04:00:00+02:00
# 5   2015-10-25 00:00:00+02:00
# 6   2015-10-25 01:00:00+02:00
# 7   2015-10-25 02:00:00+02:00
# 8   2015-10-25 02:00:00+01:00 # <-- duplicate hour due to DST transition
# 9   2015-10-25 03:00:00+01:00
# Name: datetime, dtype: datetime64[ns, Europe/Copenhagen]
zone='欧洲/哥本哈根'
#以日期开始,本地化为起始时区
df['datetime']=pd.to_datetime(df['Date'],dayfirst=True)。dt.tz_本地化(区域)
#现在将小时添加为时间增量
df['datetime']+=pd.到时间增量(df['Hour\u New'],单位为小时)
#df['datetime']
# 0   2015-03-29 00:00:00+01:00
# 1   2015-03-29 01:00:00+01:00

#3 2015-03-29 03:00:00+02:00#如果您的数据中不需要夏令时,您是否可以通过在3月和10月之间切换日期1小时来从数据集中删除夏令时?我直接从网站下载数据集,因此,该方法必须具有足够的动态性,以便能够处理日光节约。您需要知道数据生成地的DST规则;然后将所有内容正常化为UTC应该很容易。我知道它在3月的最后一个星期日和10月的最后一个星期日发生变化-我不知道如何转换这种想法感谢更新;但我必须再次要求澄清。您能否更改数据样本以显示2015-10-25第1-5小时(DST转换+1小时)以及2015-03-29第1-5小时(DST转换-1小时)的数据外观?另外,为了确定,GMT+2是UTC偏移量-什么是?首先,我可以转换为datetime-但是数据不包含小时戳-如果原始数据不包含小时戳,我不知道如何转换为小时。我仍然会保留小时数-我只需要知道3年后的小时数以及第一个小时数。hour函数只返回0。如果小时数为25,您甚至无法转换为datetime-这里只允许0-23小时。这就是为什么我开始要求帮助我制作某种计数器,可以计算特定日期“直到现在”的出现时间-ish。比如“这一行中的日期在这一行和第一行之间被看到了多少次。这有意义吗?谢谢。在做了这件事之后,只需少量的编辑(转换回一小时),就可以做到这一点!”!
import pandas as pd
import numpy as np

# mre / dummy data
df = pd.DataFrame({
    'Date': ["29-03-2015", "29-03-2015", "29-03-2015", "29-03-2015", "29-03-2015",
             "25-10-2015", "25-10-2015", "25-10-2015", "25-10-2015", "25-10-2015"],
    'Value': [1, 2, np.NaN, 4, 5,
              1, 2, 3, 4, 5]
    })

# drop all rows with NaN values; adjust if needed!
df = df.dropna()
# recalculate the hour of day, zero-based
datechange = df['Date'].eq(df['Date'].shift())
df['Hour_New'] = datechange.cumsum() - datechange.cumsum().where(~datechange).ffill()

# df
#          Date  Value  Hour_New
# 0  29-03-2015    1.0       0.0
# 1  29-03-2015    2.0       1.0
# 3  29-03-2015    4.0       2.0
# 4  29-03-2015    5.0       3.0
# 5  25-10-2015    1.0       0.0
# 6  25-10-2015    2.0       1.0
# 7  25-10-2015    3.0       2.0
# 8  25-10-2015    4.0       3.0
# 9  25-10-2015    5.0       4.0
zone = 'Europe/Copenhagen'
# begin with date, localized to origin time zone
df['datetime'] = pd.to_datetime(df['Date'], dayfirst=True).dt.tz_localize(zone)
# now add the hour as a timedelta
df['datetime'] += pd.to_timedelta(df['Hour_New'], unit='h')

# df['datetime']
# 0   2015-03-29 00:00:00+01:00
# 1   2015-03-29 01:00:00+01:00
# 3   2015-03-29 03:00:00+02:00 # <-- one hour stolen due to DST transition
# 4   2015-03-29 04:00:00+02:00
# 5   2015-10-25 00:00:00+02:00
# 6   2015-10-25 01:00:00+02:00
# 7   2015-10-25 02:00:00+02:00
# 8   2015-10-25 02:00:00+01:00 # <-- duplicate hour due to DST transition
# 9   2015-10-25 03:00:00+01:00
# Name: datetime, dtype: datetime64[ns, Europe/Copenhagen]