如何将小时划分为15米的间隔并分配数值;python中每小时的时间?
。 . 我将其保存在excel文件中,并希望在python中进行这些更改。最初,我将数据集上载到数据帧。如何将小时划分为15米的间隔并分配数值;python中每小时的时间?,python,dataframe,time,series,Python,Dataframe,Time,Series,。 . 我将其保存在excel文件中,并希望在python中进行这些更改。最初,我将数据集上载到数据帧。 有人能帮我吗?我会给你一个示例代码: | Month | day | hour | Temperature | |-----------|-----|------|-------------| | September | 01 | 0:00 | 19,11 | | September | 01 | 1:00 | 18,67 | | September |
有人能帮我吗?我会给你一个示例代码:
| Month | day | hour | Temperature |
|-----------|-----|------|-------------|
| September | 01 | 0:00 | 19,11 |
| September | 01 | 1:00 | 18,67 |
| September | 01 | 2:00 | 18,22 |
| September | 01 | 3:00 | 17,77 |
convert to:
| Month | day | hour | Temperature |
|-----------|-----|------|-------------|
| September | 01 | 0:00 | T = 19,11 |
| September | 01 | 0:15 | T2 = T + (18,67 - 19,11)/ 4 |
| September | 01 | 0:30 | T3 = T2 + (18,67 - 19,11)/4 |
| September | 01 | 0:45 | T4 = T3 + (18,67 - 19,11)/4 |
| September | 01 | 1:00 | T = 18,67 |
| September | 01 | 1:15 | T2 = T + (18,22 - 18,67)/ 4 |
| September | 01 | 1:30 | T3 = T2 + (18,22 - 18,67)/4 |
| September | 01 | 1:45 | T4 = T3 + (18,22 - 18,67)/4 |
| September | 01 | 2:00 | T = 18,22 |
x:
x = df.Temperature.str.split(",", expand=True)
y = x[0].astype(int).diff().div(4).fillna(x.iloc[0,0]).astype(float).cumsum()
y:
x = df.Temperature.str.split(",", expand=True)
y = x[0].astype(int).diff().div(4).fillna(x.iloc[0,0]).astype(float).cumsum()
对其他列也执行此操作,然后将它们合并在一起以获得“”,“
第一阶段:重采样:
df1:
x = df.Temperature.str.split(",", expand=True)
y = x[0].astype(int).diff().div(4).fillna(x.iloc[0,0]).astype(float).cumsum()
第二阶段
编辑2:
v:
x = df.Temperature.str.split(",", expand=True)
y = x[0].astype(int).diff().div(4).fillna(x.iloc[0,0]).astype(float).cumsum()
我将给您一个示例代码:
| Month | day | hour | Temperature |
|-----------|-----|------|-------------|
| September | 01 | 0:00 | 19,11 |
| September | 01 | 1:00 | 18,67 |
| September | 01 | 2:00 | 18,22 |
| September | 01 | 3:00 | 17,77 |
convert to:
| Month | day | hour | Temperature |
|-----------|-----|------|-------------|
| September | 01 | 0:00 | T = 19,11 |
| September | 01 | 0:15 | T2 = T + (18,67 - 19,11)/ 4 |
| September | 01 | 0:30 | T3 = T2 + (18,67 - 19,11)/4 |
| September | 01 | 0:45 | T4 = T3 + (18,67 - 19,11)/4 |
| September | 01 | 1:00 | T = 18,67 |
| September | 01 | 1:15 | T2 = T + (18,22 - 18,67)/ 4 |
| September | 01 | 1:30 | T3 = T2 + (18,22 - 18,67)/4 |
| September | 01 | 1:45 | T4 = T3 + (18,22 - 18,67)/4 |
| September | 01 | 2:00 | T = 18,22 |
x:
x = df.Temperature.str.split(",", expand=True)
y = x[0].astype(int).diff().div(4).fillna(x.iloc[0,0]).astype(float).cumsum()
y:
x = df.Temperature.str.split(",", expand=True)
y = x[0].astype(int).diff().div(4).fillna(x.iloc[0,0]).astype(float).cumsum()
对其他列也执行此操作,然后将它们合并在一起以获得“”,“
第一阶段:重采样:
df1:
x = df.Temperature.str.split(",", expand=True)
y = x[0].astype(int).diff().div(4).fillna(x.iloc[0,0]).astype(float).cumsum()
第二阶段
编辑2:
v:
x = df.Temperature.str.split(",", expand=True)
y = x[0].astype(int).diff().div(4).fillna(x.iloc[0,0]).astype(float).cumsum()
有
熊猫
内置的工具来实现这一点;主要的障碍是将数据转换成更友好的格式。这里是“最坏情况”,时间戳在列上分开,温度使用逗号作为小数,所有内容都是字符串:
df['hour'] = pd.to_datetime(df['hour'], format='%H:%M')
df.set_index('hour', inplace=True)
v = df.resample('15T').bfill().reset_index()
v[['temp1', 'temp2']] = v.Temperature.str.split(",", expand=True)
v['temp1'] = v['temp1'].astype(int)
v['temp2'] = v['temp2'].astype(int)
t = v.groupby(v['hour'].dt.hour)
def calc(val1, val2):
diff1 = (val1['temp1']-val2['temp1'])
diff1.iloc[0]= val1['temp1'].iloc[0]*4
diff2 = (val1['temp2']-val2['temp2'])
diff2.iloc[0]= val1['temp2'].iloc[0]*4
t1_group = diff1.div(4).cumsum()
t2_group = diff2.div(4).cumsum()
return list(zip(t1_group, t2_group))
concat_res = []
for _, gr in t:
concat_res.append(calc(gr, gr.iloc[0]))
flatten = lambda t: [item for sublist in t for item in sublist]
v['Temperature'] = flatten(concat_res)
v = v.drop(['temp1', 'temp2'],axis=1)
以下是如何使用pd.to_datetime
将时间信息转换为datetime对象:
import pandas as pd
df = pd.DataFrame({'month': 'September',
'day': '01',
'hour': ['0:00', '1:00', '2:00', '3:00'],
'temperature': ['19,11', '18,67', '18,22', '17,77']})
# month day hour temperature
# 0 September 01 0:00 19,11
# 1 September 01 1:00 18,67
# 2 September 01 2:00 18,22
# 3 September 01 3:00 17,77
下面是如何将温度转换为浮点数:
dates = df['hour'] + ', ' + df['month'] + ' ' + df['day'] + ', ' + '2020'
dates = pd.to_datetime(dates)
然后,您可以创建一个新的数据框,其中只包含日期和温度,重新采样
和插值
,以获得估算的温度:
temps = df['temperature'].str.replace(',', '.').astype(float)
结果:
df = pd.DataFrame({'temperature': temps.values},
index=dates)
result = df.resample('15T').interpolate()
如果要将时间信息返回到单独的列,可以执行以下操作:
temperature
2020-09-01 00:00:00 19.1100
2020-09-01 00:15:00 19.0000
2020-09-01 00:30:00 18.8900
2020-09-01 00:45:00 18.7800
2020-09-01 01:00:00 18.6700
2020-09-01 01:15:00 18.5575
2020-09-01 01:30:00 18.4450
2020-09-01 01:45:00 18.3325
2020-09-01 02:00:00 18.2200
2020-09-01 02:15:00 18.1075
2020-09-01 02:30:00 17.9950
2020-09-01 02:45:00 17.8825
2020-09-01 03:00:00 17.7700
结果现在是:
formatted = result.index.strftime('%B,%d,%H:%M').str.split(',').to_list()
result[['month', 'day','hour']] = formatted
result = result.reset_index(drop=True)
有pandas
内置的工具来实现这一点;主要的障碍是将数据转换成更友好的格式。这里是“最坏情况”,时间戳在列上分开,温度使用逗号作为小数,所有内容都是字符串:
df['hour'] = pd.to_datetime(df['hour'], format='%H:%M')
df.set_index('hour', inplace=True)
v = df.resample('15T').bfill().reset_index()
v[['temp1', 'temp2']] = v.Temperature.str.split(",", expand=True)
v['temp1'] = v['temp1'].astype(int)
v['temp2'] = v['temp2'].astype(int)
t = v.groupby(v['hour'].dt.hour)
def calc(val1, val2):
diff1 = (val1['temp1']-val2['temp1'])
diff1.iloc[0]= val1['temp1'].iloc[0]*4
diff2 = (val1['temp2']-val2['temp2'])
diff2.iloc[0]= val1['temp2'].iloc[0]*4
t1_group = diff1.div(4).cumsum()
t2_group = diff2.div(4).cumsum()
return list(zip(t1_group, t2_group))
concat_res = []
for _, gr in t:
concat_res.append(calc(gr, gr.iloc[0]))
flatten = lambda t: [item for sublist in t for item in sublist]
v['Temperature'] = flatten(concat_res)
v = v.drop(['temp1', 'temp2'],axis=1)
以下是如何使用pd.to_datetime
将时间信息转换为datetime对象:
import pandas as pd
df = pd.DataFrame({'month': 'September',
'day': '01',
'hour': ['0:00', '1:00', '2:00', '3:00'],
'temperature': ['19,11', '18,67', '18,22', '17,77']})
# month day hour temperature
# 0 September 01 0:00 19,11
# 1 September 01 1:00 18,67
# 2 September 01 2:00 18,22
# 3 September 01 3:00 17,77
下面是如何将温度转换为浮点数:
dates = df['hour'] + ', ' + df['month'] + ' ' + df['day'] + ', ' + '2020'
dates = pd.to_datetime(dates)
然后,您可以创建一个新的数据框,其中只包含日期和温度,重新采样
和插值
,以获得估算的温度:
temps = df['temperature'].str.replace(',', '.').astype(float)
结果:
df = pd.DataFrame({'temperature': temps.values},
index=dates)
result = df.resample('15T').interpolate()
如果要将时间信息返回到单独的列,可以执行以下操作:
temperature
2020-09-01 00:00:00 19.1100
2020-09-01 00:15:00 19.0000
2020-09-01 00:30:00 18.8900
2020-09-01 00:45:00 18.7800
2020-09-01 01:00:00 18.6700
2020-09-01 01:15:00 18.5575
2020-09-01 01:30:00 18.4450
2020-09-01 01:45:00 18.3325
2020-09-01 02:00:00 18.2200
2020-09-01 02:15:00 18.1075
2020-09-01 02:30:00 17.9950
2020-09-01 02:45:00 17.8825
2020-09-01 03:00:00 17.7700
结果现在是:
formatted = result.index.strftime('%B,%d,%H:%M').str.split(',').to_list()
result[['month', 'day','hour']] = formatted
result = result.reset_index(drop=True)
提示:.diff
和cumsum()
每小时重复4行,然后每小时添加一个排名列。我在python编程方面有一些困难。你能给我举个小例子看看我是否理解吗?我的建议是:创建一列pandas timeseries(使用pd.to\u dateime
),为空的15分钟间隔创建新行,而不是“Temperature”列。我想你可以用插值来创建新行。我不太懂。温度计算应如问题所示。感谢您的耐心。提示:.diff
和cumsum()
每小时重复4行,然后每小时添加一个排名列。我在python编程方面有一些困难。你能给我举个小例子看看我是否理解吗?我的建议是:创建一列pandas timeseries(使用pd.to\u dateime
),为空的15分钟间隔创建新行,而不是“Temperature”列。我想你可以用插值来创建新行。我不太懂。温度计算应如问题所示。谢谢你的耐心。我不明白为什么要分开温度。我的想法是做一个“for”循环,遍历具有温度的数据帧。然后,另一个“for”循环在数据框上写下4:4,每15分钟写一次日期。将它们分开的想法是为了使计算更容易。您也可以使用apply来执行此操作,而无需执行此操作。我会更新我的答案。@MárioPires:我已经更新了我的答案。问题是如果你不把它们分开,它会增加不必要的复杂性。这就是为什么最好先分开,然后用拉链把它们合在一起。我不明白分开温度的原因。我的想法是做一个“for”循环,遍历具有温度的数据帧。然后,另一个“for”循环在数据框上写下4:4,每15分钟写一次日期。将它们分开的想法是为了使计算更容易。您也可以使用apply来执行此操作,而无需执行此操作。我会更新我的答案。@MárioPires:我已经更新了我的答案。问题是如果你不把它们分开,它会增加不必要的复杂性。这就是为什么最好使用zip拆分然后合并它们。