我有一个数据集,其中包含5年中每小时的数据。每个数据点都有一个日期——我想包括一个指定小时数的列,即00-01是小时#1,01-02是小时#2,依此类推。
然而,数据集包括夏季/冬季时间,即,由于将时间提前了一个小时,3月的某一天有一个空白小时。此外,它还包括一年中的一天,由于冬季时间的推迟,该天包含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
Dates Year Month Weekday Hour ... NO1 NO2 NO5 NO3 NO4
2088 29-03-2015 2015 3 7 1 ... 22.90 22.90 22.90 22.90 22.90
2089 29-03-2015 2015 3 7 2 ... 22.37 22.37 22.37 22.37 22.37
2090 29-03-2015 2015 3 7 3 ... NaN NaN NaN NaN NaN
2091 29-03-2015 2015 3 7 4 ... 21.94 21.94 21.94 22.03 22.03
2092 29-03-2015 2015 3 7 5 ... 21.52 21.52 21.52 22.01 22.01
Dates Year Month Weekday Hour ... NO1 NO2 NO5 NO3 NO4
7128 25-10-2015 2015 10 7 1 ... 22.39 22.39 22.39 22.39 22.39
7129 25-10-2015 2015 10 7 2 ... 22.02 22.02 22.02 21.54 21.54
7130 25-10-2015 2015 10 7 3 ... 21.99 21.99 21.99 20.82 20.82
7131 25-10-2015 2015 10 7 4 ... 21.99 21.99 21.99 20.77 20.77
7132 25-10-2015 2015 10 7 5 ... 21.80 21.80 21.80 20.11 20.11
首先,我会删除具有NaN
值的行,因为这些行源自不存在的小时(DST转换(:
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]
能否将列转换为日期时间,然后从日期时间中提取小时?
然后去掉0或25的任何小时,使你的一天都变为24小时。
提示使用pandas-datetime将列转换为datetime,然后使用hour函数创建一个新列。