范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python中的时间序列数据操作总结

  时间序列数据是一种在一段时间内收集的数据类型,它通常用于金融、经济学和气象学等领域,经常通过分析来了解随着时间的推移的趋势和模式
  Pandas是Python中一个强大且流行的数据操作库,特别适合处理时间序列数据。它提供了一系列工具和函数可以轻松加载、操作和分析时间序列数据。
  在本文中,我们介绍时间序列数据的索引和切片、重新采样和滚动窗口计算以及其他有用的常见操作,这些都是使用Pandas操作时间序列数据的关键技术。数据类型
  Python
  在Python中,没有专门用于表示日期的内置数据类型。一般情况下都会使用datetime模块提供的datetime对象进行日期时间的操作。import datetime t = datetime.datetime.now() print(f"type: {type(t)} and t: {t}") #type:  and t: 2022-12-26 14:20:51.278230
  一般情况下我们都会使用字符串的形式存储日期和时间。所以在使用时我们需要将这些字符串进行转换成datetime对象。
  一般情况下时间的字符串有以下格式:YYYY-MM-DD (e.g. 2022-01-01)YYYY/MM/DD (e.g. 2022/01/01)DD-MM-YYYY (e.g. 01-01-2022)DD/MM/YYYY (e.g. 01/01/2022)MM-DD-YYYY (e.g. 01-01-2022)MM/DD/YYYY (e.g. 01/01/2022)HH:MM:SS (e.g. 11:30:00)HH:MM:SS AM/PM (e.g. 11:30:00 AM)HH:MM AM/PM (e.g. 11:30 AM)
  strptime 函数以字符串和格式字符串作为参数,返回一个datetime对象。string = "2022-01-01 11:30:09" t = datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S") print(f"type: {type(t)} and t: {t}") #type:  and t: 2022-01-01 11:30:09
  格式字符串如下:
  还可以使用strftime函数将datetime对象转换回特定格式的字符串表示。t = datetime.datetime.now() t_string = t.strftime("%m/%d/%Y, %H:%M:%S") #12/26/2022, 14:38:47 t_string = t.strftime("%b/%d/%Y, %H:%M:%S") #Dec/26/2022, 14:39:32
  Unix时间(POSIX时间或epoch时间)是一种将时间表示为单个数值的系统。它表示自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数。
  Unix时间和时间戳通常可以互换使用。Unix时间是创建时间戳的标准版本。一般情况下使用整数或浮点数据类型用于存储时间戳和Unix时间。
  我们可以使用time模块的mktime方法将datetime对象转换为Unix时间整数。也可以使用datetime模块的fromtimestamp方法。#convert datetime to unix time import time from datetime import datetime t = datetime.now() unix_t = int(time.mktime(t.timetuple())) #1672055277 #convert unix time to datetime unix_t = 1672055277 t = datetime.fromtimestamp(unix_t) #2022-12-26 14:47:57
  使用dateutil模块来解析日期字符串获得datetime对象。from dateutil import parser date = parser.parse("29th of October, 1923") #datetime.datetime(1923, 10, 29, 0, 0)
  Pandas
  Pandas提供了三种日期数据类型:
  1、Timestamp或DatetimeIndex:它的功能类似于其他索引类型,但也具有用于时间序列操作的专门函数。t = pd.to_datetime("29/10/1923", dayfirst=True) #Timestamp("1923-10-29 00:00:00") t = pd.Timestamp("2019-01-01", tz = "Europe/Berlin") #Timestamp("2019-01-01 00:00:00+0100", tz="Europe/Berlin") t = pd.to_datetime(["04/23/1920", "10/29/1923"]) #DatetimeIndex(["1920-04-23", "1923-10-29"], dtype="datetime64[ns]", freq=None)
  2、period或PeriodIndex:一个有开始和结束的时间间隔。它由固定的间隔组成。t = pd.to_datetime(["04/23/1920", "10/29/1923"]) period = t.to_period("D") #PeriodIndex(["1920-04-23", "1923-10-29"], dtype="period[D]")
  3、Timedelta或TimedeltaIndex:两个日期之间的时间间隔。delta = pd.TimedeltaIndex(data =["1 days 03:00:00",  "2 days 09:05:01.000030"]) """ TimedeltaIndex(["1 days 02:00:00", "1 days 06:05:01.000030"],  dtype="timedelta64[ns]", freq=None) """
  在Pandas中,可以使用to_datetime方法将对象转换为datetime数据类型或进行任何其他转换。import pandas as pd df = pd.read_csv("dataset.txt") df.head() """ date value 0 1991-07-01 3.526591 1 1991-08-01 3.180891 2 1991-09-01 3.252221 3 1991-10-01 3.611003 4 1991-11-01 3.565869 """ df.info() """  RangeIndex: 204 entries, 0 to 203 Data columns (total 2 columns): # Column Non-Null Count Dtype  --- ------ -------------- -----  0 date 204 non-null object  1 value 204 non-null float64 dtypes: float64(1), object(1) memory usage: 3.3+ KB """ # Convert to datetime df["date"] = pd.to_datetime(df["date"], format = "%Y-%m-%d") df.info() """  RangeIndex: 204 entries, 0 to 203 Data columns (total 2 columns): # Column Non-Null Count Dtype  --- ------ -------------- -----  0 date 204 non-null datetime64[ns] 1 value 204 non-null float64  dtypes: datetime64[ns](1), float64(1) memory usage: 3.3 KB """ # Convert to Unix df["unix_time"] = df["date"].apply(lambda x: x.timestamp()) df.head() """ date value unix_time 0 1991-07-01 3.526591 678326400.0 1 1991-08-01 3.180891 681004800.0 2 1991-09-01 3.252221 683683200.0 3 1991-10-01 3.611003 686275200.0 4 1991-11-01 3.565869 688953600.0 """ df["date_converted_from_unix"] = pd.to_datetime(df["unix_time"], unit = "s") df.head() """ date value unix_time date_converted_from_unix 0 1991-07-01 3.526591 678326400.0 1991-07-01 1 1991-08-01 3.180891 681004800.0 1991-08-01 2 1991-09-01 3.252221 683683200.0 1991-09-01 3 1991-10-01 3.611003 686275200.0 1991-10-01 4 1991-11-01 3.565869 688953600.0 1991-11-01 """
  我们还可以使用parse_dates参数在任何文件加载时直接声明日期列。df = pd.read_csv("dataset.txt", parse_dates=["date"]) df.info() """  RangeIndex: 204 entries, 0 to 203 Data columns (total 2 columns): # Column Non-Null Count Dtype  --- ------ -------------- -----  0 date 204 non-null datetime64[ns] 1 value 204 non-null float64  dtypes: datetime64[ns](1), float64(1) memory usage: 3.3 KB """
  如果是单个时间序列的数据,最好将日期列作为数据集的索引。df.set_index("date",inplace=True) """ Value date  1991-07-01 3.526591 1991-08-01 3.180891 1991-09-01 3.252221 1991-10-01 3.611003 1991-11-01 3.565869 ... ... 2008-02-01 21.654285 2008-03-01 18.264945 2008-04-01 23.107677 2008-05-01 22.912510 2008-06-01 19.431740 """
  Numpy也有自己的datetime类型np.Datetime64。特别是在大型数据集时,向量化是非常有用的,应该优先使用。import numpy as np arr_date = np.array("2000-01-01", dtype=np.datetime64) arr_date #array("2000-01-01", dtype="datetime64[D]") #broadcasting arr_date = arr_date + np.arange(30) """ array(["2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04", "2000-01-05", "2000-01-06", "2000-01-07", "2000-01-08", "2000-01-09", "2000-01-10", "2000-01-11", "2000-01-12", "2000-01-13", "2000-01-14", "2000-01-15", "2000-01-16", "2000-01-17", "2000-01-18", "2000-01-19", "2000-01-20", "2000-01-21", "2000-01-22", "2000-01-23", "2000-01-24", "2000-01-25", "2000-01-26", "2000-01-27", "2000-01-28", "2000-01-29", "2000-01-30"], dtype="datetime64[D]") """有用的函数
  下面列出的是一些可能对时间序列有用的函数。df = pd.read_csv("dataset.txt", parse_dates=["date"]) df["date"].dt.day_name() """ 0 Monday 1 Thursday 2 Sunday 3 Tuesday 4 Friday ...  199 Friday 200 Saturday 201 Tuesday 202 Thursday 203 Sunday Name: date, Length: 204, dtype: object """
  DataReader
  Pandas_datareader是pandas库的一个辅助库。它提供了许多常见的金融时间序列数据#pip install pandas-datareader from pandas_datareader import wb #GDP per Capita From World Bank df = wb.download(indicator="NY.GDP.PCAP.KD",  country=["US", "FR", "GB", "DK", "NO"], start=1960, end=2019) """ NY.GDP.PCAP.KD country year  Denmark 2019 57203.027794 2018 56563.488473 2017 55735.764901 2016 54556.068955 2015 53254.856370 ... ... United States 1964 21599.818705 1963 20701.269947 1962 20116.235124 1961 19253.547329 1960 19135.268182 [300 rows x 1 columns] """
  日期范围
  我们可以使用pandas的date_range方法定义一个日期范围。pd.date_range(start="2021-01-01", end="2022-01-01", freq="D") """ DatetimeIndex(["2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-05", "2021-01-06", "2021-01-07", "2021-01-08", "2021-01-09", "2021-01-10", ... "2021-12-23", "2021-12-24", "2021-12-25", "2021-12-26", "2021-12-27", "2021-12-28", "2021-12-29", "2021-12-30", "2021-12-31", "2022-01-01"], dtype="datetime64[ns]", length=366, freq="D") """ pd.date_range(start="2021-01-01", end="2022-01-01", freq="BM") """ DatetimeIndex(["2021-01-29", "2021-02-26", "2021-03-31", "2021-04-30", "2021-05-31", "2021-06-30", "2021-07-30", "2021-08-31", "2021-09-30", "2021-10-29", "2021-11-30", "2021-12-31"], dtype="datetime64[ns]", freq="BM") """ fridays = pd.date_range("2022-11-01", "2022-12-31", freq="W-FRI") """ DatetimeIndex(["2022-11-04", "2022-11-11", "2022-11-18", "2022-11-25", "2022-12-02", "2022-12-09", "2022-12-16", "2022-12-23", "2022-12-30"], dtype="datetime64[ns]", freq="W-FRI") """
  我们可以使用timedelta_range方法创建一个时间序列。t = pd.timedelta_range(0, periods=10, freq="H") """ TimedeltaIndex(["0 days 00:00:00", "0 days 01:00:00", "0 days 02:00:00", "0 days 03:00:00", "0 days 04:00:00", "0 days 05:00:00", "0 days 06:00:00", "0 days 07:00:00", "0 days 08:00:00", "0 days 09:00:00"], dtype="timedelta64[ns]", freq="H") """
  格式化
  我们dt.strftime方法改变日期列的格式。df["new_date"] = df["date"].dt.strftime("%b %d, %Y") df.head() """ date value new_date 0 1991-07-01 3.526591 Jul 01, 1991 1 1991-08-01 3.180891 Aug 01, 1991 2 1991-09-01 3.252221 Sep 01, 1991 3 1991-10-01 3.611003 Oct 01, 1991 4 1991-11-01 3.565869 Nov 01, 1991 """
  解析
  解析datetime对象并获得日期的子对象。df["year"] = df["date"].dt.year df["month"] = df["date"].dt.month df["day"] = df["date"].dt.day df["calendar"] = df["date"].dt.date df["hour"] = df["date"].dt.time df.head() """ date value year month day calendar hour 0 1991-07-01 3.526591 1991 7 1 1991-07-01 00:00:00 1 1991-08-01 3.180891 1991 8 1 1991-08-01 00:00:00 2 1991-09-01 3.252221 1991 9 1 1991-09-01 00:00:00 3 1991-10-01 3.611003 1991 10 1 1991-10-01 00:00:00 4 1991-11-01 3.565869 1991 11 1 1991-11-01 00:00:00 """
  还可以重新组合它们。df["date_joined"] = pd.to_datetime(df[["year","month","day"]]) print(df["date_joined"]) """ 0 1991-07-01 1 1991-08-01 2 1991-09-01 3 1991-10-01 4 1991-11-01 ...  199 2008-02-01 200 2008-03-01 201 2008-04-01 202 2008-05-01 203 2008-06-01 Name: date_joined, Length: 204, dtype: datetime64[ns]
  过滤查询
  使用loc方法来过滤DataFrame。df = df.loc["2021-01-01":"2021-01-10"]
  truncate 可以查询两个时间间隔中的数据df_truncated = df.truncate("2021-01-05", "2022-01-10")
  常见数据操作
  下面就是对时间序列数据集中的值执行操作。我们使用yfinance库创建一个用于示例的股票数据集。#get google stock price data import yfinance as yf start_date = "2020-01-01" end_date = "2023-01-01" ticker = "GOOGL" df = yf.download(ticker, start_date, end_date) df.head() """ Date Open High Low Close Adj Close Volume  2020-01-02 67.420502 68.433998 67.324501 68.433998 68.433998 27278000 2020-01-03 67.400002 68.687500 67.365997 68.075996 68.075996 23408000 2020-01-06 67.581497 69.916000 67.550003 69.890503 69.890503 46768000 2020-01-07 70.023003 70.175003 69.578003 69.755501 69.755501 34330000 2020-01-08 69.740997 70.592499 69.631500 70.251999 70.251999 35314000 """
  计算差值
  diff函数可以计算一个元素与另一个元素之间的插值。#subtract that day"s value from the previous day df["Diff_Close"] = df["Close"].diff() #Subtract that day"s value from the day"s value 2 days ago df["Diff_Close_2Days"] = df["Close"].diff(periods=2)
  累计总数df["Volume_Cumulative"] = df["Volume"].cumsum()
  滚动窗口计算
  滚动窗口计算(移动平均线)。df["Close_Rolling_14"] = df["Close"].rolling(14).mean() df.tail()
  可以对我们计算的移动平均线进行可视化
  常用的参数:center:决定滚动窗口是否应以当前观测值为中心。min_periods:窗口中产生结果所需的最小观测次数。s = pd.Series([1, 2, 3, 4, 5]) #the rolling window will be centered on each observation rolling_mean = s.rolling(window=3, center=True).mean() """ 0 NaN 1 2.0 2 3.0 3 4.0 4 NaN dtype: float64 Explanation: first window: [na 1 2] = na second window: [1 2 3] = 2 """ # the rolling window will not be centered,  #and will instead be anchored to the left side of the window rolling_mean = s.rolling(window=3, center=False).mean() """ 0 NaN 1 NaN 2 2.0 3 3.0 4 4.0 dtype: float64 Explanation: first window: [na na 1] = na second window: [na 1 2] = na third window: [1 2 3] = 2 """
  平移
  Pandas有两个方法,shift()和tshift(),它们可以指定倍数移动数据或时间序列的索引。Shift()移位数据,而tshift()移位索引。#shift the data df_shifted = df.shift(5,axis=0) df_shifted.head(10) #shift the indexes df_tshifted = df.tshift(periods = 4, freq = "D") df_tshifted.head(10)
  df_shifted
  df_tshifted
  时间间隔转换
  在 Pandas 中,操 to_period 函数允许将日期转换为特定的时间间隔。可以获取具有许多不同间隔或周期的日期df["Period"] = df["Date"].dt.to_period("W")
  频率
  Asfreq方法用于将时间序列转换为指定的频率。monthly_data = df.asfreq("M", method="ffill")
  常用参数:
  freq:数据应该转换到的频率。这可以使用字符串别名(例如,"M"表示月,"H"表示小时)或pandas偏移量对象来指定。
  method:如何在转换频率时填充缺失值。这可以是"ffill"(向前填充)或"bfill"(向后填充)之类的字符串。
  采样
  resample可以改变时间序列频率并重新采样。我们可以进行上采样(到更高的频率)或下采样(到更低的频率)。因为我们正在改变频率,所以我们需要使用一个聚合函数(比如均值、最大值等)。
  resample方法的参数:
  rule:数据重新采样的频率。这可以使用字符串别名(例如,"M"表示月,"H"表示小时)或pandas偏移量对象来指定。#down sample monthly_data = df.resample("M").mean()
  #up sample minute_data = data.resample("T").ffill()
  百分比变化
  使用pct_change方法来计算日期之间的变化百分比。df["PCT"] = df["Close"].pct_change(periods=2) print(df["PCT"]) """ Date 2020-01-02 NaN 2020-01-03 NaN 2020-01-06 0.021283 2020-01-07 0.024671 2020-01-08 0.005172 ...  2022-12-19 -0.026634 2022-12-20 -0.013738 2022-12-21 0.012890 2022-12-22 -0.014154 2022-12-23 -0.003907 Name: PCT, Length: 752, dtype: float64 """总结
  在Pandas和NumPy等库的帮助下,可以对时间序列数据执行广泛的操作,包括过滤、聚合和转换。本文介绍的是一些在工作中经常遇到的常见操作,希望对你有所帮助。
  作者:Okan Yenigün

柳暗花明!大胜开拓者,让衰败的湖人重拾信心从赛季初期信誓旦旦地冲击季后赛,到如今惨淡的战绩,湖人留给球迷的印象,更多的是困惑挣扎。甚至有的球迷开始抵制湖人,因为在他们的心中,湖人是不可战胜的,是永远的紫金王朝,他们不想看到2换1!勇士报价德罗赞,筹码低调曝光尽管卫冕军勇士开赛以来仅以11胜11负的战绩,勉强名列西部第8,但阵中34岁的当家球星斯蒂芬库里依旧打出了史上最佳的赛季之一。根据数据网站统计,库里在11月份,场均能够交出31。6如何延长运动寿命?35岁的球星梅西有一份饮食清单受访专家北京体育大学运动人体科学学院副教授苏浩环球时报健康客户端记者单祺雯12月1日凌晨3点,卡塔尔世界杯C组第3轮小组赛即将开打,很多人的目光都集中到了阿根廷队身上。在这场关键的95后山东小伙勇闯非洲4年,请马赛人当保镖,发现非洲海鲜很便宜这是真实人物故事会讲述的第92位人物。小编最近刷到非洲小五的视频,一位95后山东小伙闯荡非洲4年,还雇佣了两位马赛人当保镖,小五在非洲实现了海鲜自由,日常不是吃龙虾就是吃金枪鱼,发世界杯十六强全部出炉,韩国补时绝杀葡萄牙,压哨出线2022年卡塔尔世界杯今天凌晨结束了所有小组赛的征程十六强球队全部落位韩国补时绝杀葡萄牙瑞士进球大战力克塞尔维亚拿到最后两张门票亚足联球队则创纪录地有三支晋级韩国力克葡萄牙两队携手一级致癌物被揪出,世卫组织呼吁建议停止食用,别太大意在大多数人心中,癌症往往与绝症是同义词,癌症的可怕源自人们对不治之症的恐惧,事实上,癌症的真相远比上述理解更复杂。常见致癌的因素有哪些?1最常见的致癌物是生活中常见的香烟,无论是谁中国最大的死火山岛涠洲岛涠洲岛位于广西北海市北海湾海域中部,是因火山喷发堆积而形成的岛屿,岛上岩奇洞深,风光旖旎,素有大蓬莱仙岛之称。我是5月去的涠洲岛,因不是旺季,岛上住宿很便宜,我在岛上住了10天。如中国品牌进军新能源MPV市场的先锋兵作为中国品牌进军新能源MPV市场的先锋兵,腾势D9采用全新的Motion设计语言,前脸极具辨识度,而DMi车型的中网以仿钻切割技术加持,更有设计感。腾势D9的整车侧面姿态浑厚大气,中国科大实现非接触心电图实时监测大皖新闻讯中国科学技术大学吴曼青院士团队陈彦教授孙启彬研究员等人在无线人体感知研究中取得重要进展,实现了基于毫米波雷达的非接触人体心电图实时监测,突破了百余年来心电图仅能通过接触式为何不再建议大家一天喝够8杯水?问为何不再建议大家一天喝够8杯水?一直以来,每天喝够8杯水是很多人对健康饮水量的认知。不过,近年来,越来越多的科学研究不再支持这个说法。究其原因,还是与不同人群之间存在需水量差异有湖人收获3换2交易建议!264巨星助力詹姆斯,新三巨头统治西部?交易背景虽然赛季刚开始,湖人遭遇了一系列连败,球队没有任何夺冠希望,但经过了马刺3送温暖,篮网开拓者的助力,战绩来到8胜12负,一度让湖人看到了补强的希望。最近湖人管理层又打起了补
我是保姆,雇主家总来亲戚一住就很久,我该怎么办?我是一个保姆,我去年干活的雇主家,女雇主的老爸总来她家住,而且一住就是二十天或者一个月,老人这一年当中有三分之二的时间都在女儿家住。这是我没来之前不知道的事情。最开始面试的时候,也采购工作做久了,你有什么职业病?采购是一个公司的大动脉,在上市公司都是讲供应链,是一个实权部门,也是一个油水衙门,国企都是掌握在派系之内,私企都是掌握在血缘关系手中,这就是咱国内的国情,借这个平台和机会,我跟大家老板提拔拉帮结派的员工,排挤老实人,你怎么看?我相信很多人都遇到过类似的问题,也非常不解领导这样做的原因,但是我可以负责任的告诉你们,这个领导做的非常的对,因为他是站在公司的角度上,才会做出这样的选择!在公司中拉帮结派的人都有假如你负债五十万月薪三千,你会怎么办?多数人遇到这种情况一定是万念俱灭,心如死灰因此,今天我们就来讨论一下当你感觉到无助的时候,该怎么办。关于工资低没钱还债,我想到了不久前看过的一部韩剧我的大叔。剧中的女主从小和哑巴奶猪价持续暴跌,2022年春节猪肉还能降到10元一斤吗?元旦即将来临,猪价近两天持续暴跌。四天的时间平均每公斤下跌了0。82元,这个跌幅还是非常大的。近期生猪价格下跌。带动的也是猪肉价格也开始下跌了?目前猪肉价格已经跌至12元一斤,那么创业者如何培养良好的工作习惯?谢邀,我是明哥,前麦肯锡战略咨询顾问,埃森哲管理咨询顾问,一个喜欢用思维导图架构PPT的老司机,欢迎关注我的头条号,一起成为职场精英。创业者如何培养良好的工作习惯,我分享4点建议。人到中年,在单位从一个重要骨干到现在成为一个可有可无的人,要不要辞职呢?谢邀,人总是从年轻到中年至老年,这是自然规律。在职场对一位用心钻研技术后成为企业生产骨干力量的中年同志,或者说在某一线岗位表现突出,后逐渐成长为管理岗位上的中年业务骨干,这都是很正江西宜春新余有可能会合并吗?有可能。历史上,一千多年前,宜春新余萍乡都属于袁州府管辖。当时府所在地就在宜春。宜春当时是全府政治文化中心,也是全府物资集散地。从现代来看,宜春市人口和经济总量都是新余市不可比的。农村残疾人的路在何方?残疾人在被人瞧不起时如何找到工作改变人生呢?农村的残疾人是一批弱势群体,应得到社会的关爱和尊重,要有人道主义,帮助身残人去改变人生。不得歧视嘲笑身带残的人。残联与相关机构,还得为身残人创造就业机会,为有缺陷身残人找适宜职业,农村父母已过逝,农村宅基地房子翻盖新房是否合法?该怎么办?首先,我们来敲黑板。本次的政策并不是新的政策,其实一直就有。只不过以前没有明确,地方政府也摸不着头脑。所谓宅基地继承,是不存在的。因为宅基地本质归集体所有,你如何继承?准确的说法是老年人再婚,男方拒绝女方将来继承遗产,重病自理,你怎么看?我感觉是很合理的,自己前半都有自己的孩子,自己的房产,自己的存款。老人再婚是身体好时,互相有个伴,有个说话的,真的病倒了,还是各靠自己家人照顾,在婚前说好了,是不错的选择!什么事情