Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将小时划分为15米的间隔并分配数值​;python中每小时的时间?_Python_Dataframe_Time_Series - Fatal编程技术网

如何将小时划分为15米的间隔并分配数值​;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 |

。 .

我将其保存在excel文件中,并希望在python中进行这些更改。最初,我将数据集上载到数据帧。
有人能帮我吗?

我会给你一个示例代码:

| 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拆分然后合并它们。