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