Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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
Python 校正时间序列中的时钟漂移_Python_Pandas_Time_Time Series - Fatal编程技术网

Python 校正时间序列中的时钟漂移

Python 校正时间序列中的时钟漂移,python,pandas,time,time-series,Python,Pandas,Time,Time Series,首先,我对这个请求的命名表示歉意——我有点不确定该技术的确切标签是什么。我会尽力解释清楚 我让伐木工人在现场收集环境数据。他们的内部时钟在进入现场之前与“实时”同步。然而,内部时钟在其整个工作寿命内开始偏离实时。例如,在字段中使用一年后,数据文件仍然报告记录小时数(例如,20:00:00),但实际时间可能是20:07。记录者通常工作多年,记录速率可以在1分钟到4小时之间(尽管在一个文件中总是相同的记录速率)。 我以前使用的软件在内部完成了同步。我现在使用的软件,不幸的是不包含这样的功能;不过,它

首先,我对这个请求的命名表示歉意——我有点不确定该技术的确切标签是什么。我会尽力解释清楚

我让伐木工人在现场收集环境数据。他们的内部时钟在进入现场之前与“实时”同步。然而,内部时钟在其整个工作寿命内开始偏离实时。例如,在字段中使用一年后,数据文件仍然报告记录小时数(例如,20:00:00),但实际时间可能是20:07。记录者通常工作多年,记录速率可以在1分钟到4小时之间(尽管在一个文件中总是相同的记录速率)。 我以前使用的软件在内部完成了同步。我现在使用的软件,不幸的是不包含这样的功能;不过,它确实有一个API,允许在附加到现有数据集之前使用python进行“预处理”

目标是“拉伸”或“滞后”,或者更一般地,调整时间,使最后一个日志等于“真实时间”。一个简单的例子:

原件:

Datetime,Value
24/03/2018 10:00:00,25.966
24/03/2018 11:00:00,27.402
24/03/2018 12:00:00,29.137
24/03/2018 13:00:00,32.001
24/03/2018 14:00:00,33.661
24/03/2018 15:00:00,34.852
24/03/2018 16:00:00,34.252
24/03/2018 17:00:00,31.605
24/03/2018 18:00:00,30.033
24/03/2018 19:00:00,27.790
24/03/2018 20:00:00,26.214
成为:

Datetime,Value
24/03/2018 10:00:00,25.966
24/03/2018 11:00:42,27.402
24/03/2018 12:01:24,29.137
24/03/2018 13:02:06,32.001
24/03/2018 14:02:48,33.661
24/03/2018 15:03:30,34.852
24/03/2018 16:04:12,34.252
24/03/2018 17:04:54,31.605
24/03/2018 18:05:36,30.033
24/03/2018 19:06:18,27.790
24/03/2018 20:07:00,26.214
有哪些方法可以同步/对齐数据?是否需要重新采样?还是有更简单的方法来实现这一点

日期时间和值

df = {'2018-03-24 10:00:00': {'Value': 25.966}, '2018-03-24 11:00:00': {'Value': 27.402},'2018-03-24 12:00:00': {'Value': 29.137}, '2018-03-24 13:00:00': {'Value': 32.001},'2018-03-24 14:00:00': {'Value': 33.661}, '2018-03-24 15:00:00': {'Value': 34.852},'2018-03-24 16:00:00': {'Value': 34.252}, '2018-03-24 17:00:00': {'Value': 31.605},'2018-03-24 18:00:00': {'Value': 30.033}, '2018-03-24 19:00:00': {'Value': 27.790},'2018-03-24 20:00:00': {'Value': 26.214}}
如果您能提供任何帮助,甚至是建议您朝哪个方向看,我们将不胜感激


谢谢。

我会这样做(开始和结束的排版可能需要一些改进,因为它有点笨重,但很有效):

def dedrift(df,开始=无,结束=无): epochs=pd.to_datetime(df.index).astype(int) first=pd.to_datetime(start).to_datetime64().astype(int)如果start不是其他历元[0] last=pd.to_datetime(end).to_datetime64().astype(int)如果end不是None-other历元[-1] 间隔=(最后一个-第一个)/(长度(df)-1) df['dedrifted']=pd.to_datetime(范围(第一,最后+1,间隔)) 返回df 它计算开始和结束之间的时间跨度(以纳秒为单位),并用已知时间替换任一端点,以创建新的规则间隔时间序列。请注意,这取决于您声明的假设“在一个文件中始终保持相同的日志速率”。不规则采样的数据集需要不同的方法

您可以使用
start
和/或
end
提供已知的边界条件(例如,安装或拆卸传感器的准确时间):

>>df=pd.DataFrame({'2018-03-2410:00:00':{'Value':25.966},'2018-03-2411:00:00':{'Value':27.402},'2018-03-2412:00:00':{'Value':29.137},'2018-03-2413:00:00':{'Value':32.001},'2018-03-2414:00:00':{'Value':33.661},'2018-03-2415:00:00':00':{'Value':252{'Value':31.605},'2018-03-2418:00:00':{'Value':30.033},'2018-03-2419:00:00':{'Value':27.790},'2018-03-2420:00:00':{'Value':26.214})
>>>dedrift(df,end='2018-03-24 20:07:00')
价值去分化
2018-03-24 10:00:00  25.966 2018-03-24 10:00:00
2018-03-24 11:00:00  27.402 2018-03-24 11:00:42
2018-03-24 12:00:00  29.137 2018-03-24 12:01:24
2018-03-24 13:00:00  32.001 2018-03-24 13:02:06
2018-03-24 14:00:00  33.661 2018-03-24 14:02:48
2018-03-24 15:00:00  34.852 2018-03-24 15:03:30
2018-03-24 16:00:00  34.252 2018-03-24 16:04:12
2018-03-24 17:00:00  31.605 2018-03-24 17:04:54
2018-03-24 18:00:00  30.033 2018-03-24 18:05:36
2018-03-24 19:00:00  27.790 2018-03-24 19:06:18
2018-03-24 20:00:00  26.214 2018-03-24 20:07:00

Sebs的答案对这个概念确实有帮助,但我就是无法让它正常工作而不出错

我最终使用了一些不同的东西(但使用了Sebs答案中的想法)。安装记录器时,时间是同步的,所以我可以锚定它

df = pd.read_csv(file, skiprows=sRow, index_col=0, parse_dates=True, dayfirst=True, usecols=[cols for cols in range(5)])

def TimeAlign(df):
    logStart = df.index[0]
    logEnd = df.index[-1]
    logNum = len(df)
    logFreq = pd.Timedelta(df.index[1] - df.index[0])
    logDiff = pd.Timedelta(pd.to_datetime(input("Enter real time of last log (e.g 01/01/2020 10:07):")) - logEnd)
    logDrift = pd.Timedelta(logDiff / (logNum -1) + logFreq)

    df.index = pd.date_range(start=logStart, periods=logNum, freq=logDrift)
    df.index = df.index.round('1s')

    df.to_csv('TimeAlign.csv', float_format='%.3f' )

    return df

TimeAlign(df)

这有两个步骤。第一个步骤是根据边界条件修正观测时间。你似乎已经解决了上面的问题(手动?).第二个是重采样,只有当你要求所有传感器之间的观测时间相等时才需要重采样。这是你的要求吗?如果不是,我就不需要重采样了,因为它引入了一种猜测(因为没有更好的词)并且取决于过滤器的选择等。传感器不要求相等;它们在不同的时间在现场下载。但是“成为”列表只是手动完成的;我不知道如何使用python实现这一点。谢谢回答。我明白了。我在下面提供了一个我之前编写的函数,可以完成这一部分。谢谢!我已经用c仔细查看您的示例,但是我得到了错误“ValueError:值的长度与索引的长度不匹配”。哦,很抱歉,
pd.RangeIndex
创建了长度为10的索引,而具有相同参数的Python
range
的索引的长度为11。现在应该可以工作了。我有一个类似的问题,但我没有“tru”e’开始和结束时间(事实上,“记录者”在稍有不同的时间开始/结束数据采集),且采样不规则(由环境噪音决定)。如何处理此类问题?