找回密码
 会员注册
查看: 38|回复: 0

Python酷库之旅-第三方库Pandas(071)

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
70601
发表于 2024-9-10 02:51:03 | 显示全部楼层 |阅读模式
目录一、用法精讲286、pandas.Series.dt.to_pydatetime方法286-1、语法286-2、参数286-3、功能286-4、返回值286-5、说明286-6、用法286-6-1、数据准备286-6-2、代码示例286-6-3、结果输出287、pandas.Series.dt.tz_localize方法287-1、语法287-2、参数287-3、功能287-4、返回值287-5、说明287-6、用法287-6-1、数据准备287-6-2、代码示例287-6-3、结果输出288、pandas.Series.dt.tz_convert方法288-1、语法288-2、参数288-3、功能288-4、返回值288-5、说明288-6、用法288-6-1、数据准备288-6-2、代码示例288-6-3、结果输出289、pandas.Series.dt.normalize方法289-1、语法289-2、参数289-3、功能289-4、返回值289-5、说明289-6、用法289-6-1、数据准备289-6-2、代码示例289-6-3、结果输出290、pandas.Series.dt.strftime函数290-1、语法290-2、参数290-2-1、年份相关格式290-2-2、月份相关格式290-2-3、日期相关格式290-2-4、星期相关格式290-2-5、年中的日期格式290-2-6、时间相关格式290-2-7、时区和时间差格式290-2-8、日期与时间组合格式290-2-9、其他格式290-3、功能290-4、返回值290-5、说明290-6、用法290-6-1、数据准备290-6-2、代码示例290-6-3、结果输出二、推荐阅读1、Python筑基之旅2、Python函数之旅3、Python算法之旅4、Python魔法之旅5、博客个人主页一、用法精讲286、pandas.Series.dt.to_pydatetime方法286-1、语法#286、pandas.Series.dt.to_pydatetime方法pandas.Series.dt.to_pydatetime()Returnthedataasanarrayofdatetime.datetimeobjects.Deprecatedsinceversion2.1.0:Thecurrentbehaviorofdt.to_pydatetimeisdeprecated.InafutureversionthiswillreturnaSeriescontainingpythondatetimeobjectsinsteadofandarray.Timezoneinformationisretainedifpresent.WarningPython’sdatetimeusesmicrosecondresolution,whichislowerthanpandas(nanosecond).Thevaluesaretruncated.Returns:numpy.ndarrayObjectdtypearraycontainingnativePythondatetimeobjects.286-2、参数    无286-3、功能        将pandas.Series中的日期时间类型值(如Timestamp对象)转换为Python原生的datetime对象数组,该方法在以下几种情况下特别有用:286-3-1、与其他库的兼容性:有些库或函数只接受Python原生的datetime对象,而不接受pandas.Timestamp对象,这时可以使用该方法进行转换。286-3-2、日期时间处理:在进行日期时间运算或处理时,有时需要使用Python的内置日期时间处理功能,该方法可以简化这种转换过程。286-3-3、数据传递:当需要将数据传递给仅支持Python原生datetime对象的外部系统或接口时,可以使用此方法进行转换。286-4、返回值        返回一个numpy.ndarray,其中包含与原Series中的每个元素对应的datetime.datetime对象。换句话说,返回的数组中的每个元素都是原Series中Timestamp对象的Python原生datetime对象版本。286-5、说明    使用场景:286-5-1、与其他库或函数的兼容性:许多库(如matplotlib、seaborn)和函数需要使用Python原生的datetime对象,而不是pandas的Timestamp对象。在这种情况下,可以使用to_pydatetime方法进行转换,从而确保兼容性。例如,在绘制时间序列图时,某些图形库可能只接受datetime对象。286-5-2、日期时间处理:有时需要利用Python的内置日期时间处理功能来进行复杂的日期时间运算或处理,这些操作可能在datetime对象上更容易实现,因此可以先将pandas.Timestamp对象转换为datetime对象。例如,使用datetime的方法和属性(如weekday()、replace()等)进行特定的日期操作。286-5-3、数据传递:当需要将数据传递给仅支持Python原生datetime对象的外部系统或接口时,可以使用该方法进行转换。例如,某些API或数据库接口只接受datetime对象,使用to_pydatetime方法可以确保数据格式的正确性。286-5-4、调试和数据检查:在调试和数据检查过程中,有时需要查看或打印日期时间值的具体内容,使用datetime对象进行检查可能更直观,因为datetime对象的字符串表示形式比Timestamp对象更易读。286-5-5、处理缺失数据:在处理缺失日期时间数据时,转换为datetime对象可以更方便地使用Python的原生方法进行处理。例如,可以利用datetime的min和max属性来处理缺失值。286-6、用法286-6-1、数据准备无286-6-2、代码示例#286、pandas.Series.dt.to_pydatetime方法#286-1、使用matplotlib绘制时间序列图importpandasaspdimportmatplotlib.pyplotasplt#创建包含日期时间值的Seriesdate_series=pd.Series(pd.date_range('2024-05-01',periods=10,freq='D'))#转换为Pythondatetime对象dates=date_series.dt.to_pydatetime()#使用matplotlib绘制时间序列图plt.plot(dates,range(10))plt.xlabel('Date')plt.ylabel('Value')plt.title('TimeSeriesPlot')#让x轴的标签斜着显示plt.xticks(rotation=45)plt.show()#286-2、使用原生datetime方法进行日期处理importpandasaspd#创建包含日期时间值的Seriesdate_series=pd.Series(pd.date_range('2024-07-01',periods=5,freq='D'))#转换为Pythondatetime对象dates=date_series.dt.to_pydatetime()#计算每个日期是星期几weekdays=[date.weekday()fordateindates]print(weekdays,end='\n\n')#286-3、将数据传递给支持datetime的接口importpandasaspd#创建包含日期时间值的Seriesdate_series=pd.Series(pd.date_range('2024-08-01',periods=5,freq='D'))#转换为Pythondatetime对象dates=date_series.dt.to_pydatetime()#假设有一个只接受datetime对象的函数defprocess_dates(dates):fordateindates:print(f"Processingdate:{date}")#286-4、处理缺失数据importpandasaspdfromdatetimeimportdatetime#创建包含日期时间值和缺失值的Seriesdate_series=pd.Series([pd.Timestamp('2024-01-01'),pd.NaT,pd.Timestamp('2024-01-03')])#转换为Pythondatetime对象,并处理缺失值dates=date_series.dt.to_pydatetime()dates=[dateifdateisnotpd.NaTelsedatetime.minfordateindates]print(dates,end='\n\n')#286-5、与其他库兼容性importpandasaspdimportseabornassnsimportmatplotlib.pyplotasplt#创建包含日期时间值的DataFramedf=pd.DataFrame({'date':pd.date_range('2024-07-01',periods=10,freq='D'),'value':range(10)})#转换日期列为Pythondatetime对象df['date']=df['date'].dt.to_pydatetime()#使用seaborn绘制时间序列图sns.lineplot(x='date',y='value',data=df)plt.xlabel('Date')plt.ylabel('Value')plt.title('TimeSeriesPlotwithSeaborn')#让x轴的标签斜着显示plt.xticks(rotation=45)plt.show()286-6-3、结果输出#286、pandas.Series.dt.to_pydatetime方法#286-1、使用matplotlib绘制时间序列图#见图1#286-2、使用原生datetime方法进行日期处理#[0,1,2,3,4]#286-3、将数据传递给支持datetime的接口#Processingdate:2024-08-0100:00:00#Processingdate:2024-08-0200:00:00#Processingdate:2024-08-0300:00:00#Processingdate:2024-08-0400:00:00#Processingdate:2024-08-0500:00:00#286-4、处理缺失数据#[datetime.datetime(2024,1,1,0,0),datetime.datetime(1,1,1,0,0),datetime.datetime(2024,1,3,0,0)]#286-5、与其他库兼容性#见图2图1: 图2: 287、pandas.Series.dt.tz_localize方法287-1、语法#287、pandas.Series.dt.tz_localize方法pandas.Series.dt.tz_localize(*args,**kwargs)Localizetz-naiveDatetimeArray/Indextotz-awareDatetimeArray/Index.Thismethodtakesatimezone(tz)naiveDatetimeArray/Indexobjectandmakesthistimezoneaware.Itdoesnotmovethetimetoanothertimezone.Thismethodcanalsobeusedtodotheinverse–tocreateatimezoneunawareobjectfromanawareobject.Tothatend,passtz=None.Parameters:tzstr,pytz.timezone,dateutil.tz.tzfile,datetime.tzinfoorNoneTimezonetoconverttimestampsto.PassingNonewillremovethetimezoneinformationpreservinglocaltime.ambiguous‘infer’,‘NaT’,boolarray,default‘raise’WhenclocksmovedbackwardduetoDST,ambiguoustimesmayarise.ForexampleinCentralEuropeanTime(UTC+01),whengoingfrom03:00DSTto02:00non-DST,02:30:00localtimeoccursbothat00:30:00UTCandat01:30:00UTC.Insuchasituation,theambiguousparameterdictateshowambiguoustimesshouldbehandled.‘infer’willattempttoinferfalldst-transitionhoursbasedonorderbool-ndarraywhereTruesignifiesaDSTtime,Falsesignifiesanon-DSTtime(notethatthisflagisonlyapplicableforambiguoustimes)‘NaT’willreturnNaTwherethereareambiguoustimes‘raise’willraiseanAmbiguousTimeErrorifthereareambiguoustimes.nonexistent‘shift_forward’,‘shift_backward,‘NaT’,timedelta,default‘raise’AnonexistenttimedoesnotexistinaparticulartimezonewhereclocksmovedforwardduetoDST.‘shift_forward’willshiftthenonexistenttimeforwardtotheclosestexistingtime‘shift_backward’willshiftthenonexistenttimebackwardtotheclosestexistingtime‘NaT’willreturnNaTwheretherearenonexistenttimestimedeltaobjectswillshiftnonexistenttimesbythetimedelta‘raise’willraiseanNonExistentTimeErroriftherearenonexistenttimes.Returns:SametypeasselfArray/Indexconvertedtothespecifiedtimezone.Raises:TypeErrorIftheDatetimeArray/Indexistz-awareandtzisnotNone.287-2、参数287-2-1、*args(可选):其他位置参数,为后续扩展功能做预留。287-2-2、**kwargs(可选):其他关键字参数,具体包括以下参数:287-2-2-1、tz(可选,默认值为None):字符串或pytz.timezone对象,指定要设置的时区,当传入None时,会移除现有的时区信息。287-2-2-2、axis(可选,默认值为0):整数或字符串,指定应用于行还是列。287-2-2-3、level(可选,默认值为0):整数或名称,在MultiIndex场景下,指定要本地化的索引级别。287-2-2-4、copy(可选,默认值为True):布尔值,是否返回一个新的对象,如果为True,返回一个新的对象;如果为False,在原对象上进行操作。287-2-2-5、ambiguous(可选,默认值为'raise'):字符串或布尔型ndarray,处理夏令时(DST)变化期间的模糊时间,选项有:'raise':在模糊时间时引发错误(默认)。'NaT':将模糊时间标记为NaT。'shift_forward':将模糊时间移到DST结束后的时间。'shift_backward':将模糊时间移到DST开始前的时间。布尔型ndarray:明确标记每个时间是否为DST(True为DST)。287-2-2-6、nonexistent(可选,默认值为'raise'):字符串,处理夏令时变化期间不存在的时间,选项有:'raise':在不存在的时间时引发错误(默认)。'NaT':将不存在的时间标记为NaT。'shift_forward':将不存在的时间移到DST结束后的时间。'shift_backward':将不存在的时间移到DST开始前的时间。287-3、功能        将一个时间序列(datetimeSeries)本地化到指定的时区(timezone)。具体来说,它可以将一个“天真时间”(naivedatetime,即没有时区信息的时间)或已有时区信息的时间序列转换为具有指定时区的时间序列。287-4、返回值        返回一个新的时间序列,这个序列中的每个时间点都包含了指定的时区信息,返回的时间序列类型为pandas.Series,其元素为pandas.Timestamp对象,这些对象具有时区信息。287-5、说明    无287-6、用法287-6-1、数据准备无287-6-2、代码示例#287、pandas.Series.dt.tz_localize方法#287-1、时区本地化importpandasaspd#创建没有时区信息的时间序列naive_series=pd.Series(pd.date_range('2024-08-01',periods=3,freq='D'))#打印原始数据print("原始时间序列:")print(naive_series)#将时间序列本地化到UTC时区localized_series=naive_series.dt.tz_localize('UTC')#打印本地化后的时间序列print("本地化到UTC时区后的时间序列:")print(localized_series,end='\n\n')#287-2、数据一致性importpandasaspd#创建两个不同的时间序列,分别在不同的时区series1=pd.Series(pd.date_range('2024-08-01',periods=3,freq='D',tz='UTC'))series2=pd.Series(pd.date_range('2024-08-01',periods=3,freq='D',tz='Asia/Kolkata'))#打印原始数据print("不同来源的时间序列:")print("Series1(UTC):")print(series1)print("Series2(Asia/Kolkata):")print(series2)#将所有数据转换到UTC时区series2=series2.dt.tz_convert('UTC')#打印转换后的时间序列print("转换到UTC时区后的时间序列:")print(series2,end='\n\n')#287-3、夏令时处理importpandasaspd#创建一个包含夏令时变化的时间序列dst_series=pd.Series(pd.date_range('2024-03-1301:00',periods=3,freq='h'))#打印原始数据print("包含夏令时变化的原始时间序列:")print(dst_series)#处理夏令时模糊时间localized_dst_series=dst_series.dt.tz_localize('US/Eastern',ambiguous='shift_forward')#打印处理后的时间序列print("处理夏令时模糊时间后的时间序列(shift_forward):")print(localized_dst_series)#处理夏令时不存在的时间localized_nonexistent_series=dst_series.dt.tz_localize('US/Eastern',nonexistent='shift_forward')#打印处理后的时间序列print("处理夏令时不存在时间后的时间序列(shift_forward):")print(localized_nonexistent_series,end='\n\n')#287-4、数据转换和展示importpandasaspd#创建在UTC时区的时间序列utc_series=pd.Series(pd.date_range('2024-08-01',periods=3,freq='D',tz='UTC'))#打印原始数据print("UTC时区的原始时间序列:")print(utc_series)#转换到用户所在的时区(America/New_York)user_tz_series=utc_series.dt.tz_convert('America/New_York')#打印转换后的时间序列print("转换到用户所在时区(America/New_York)后的时间序列:")print(user_tz_series,end='\n\n')#287-5、数据存储和传输importpandasaspd#创建没有时区信息的时间序列naive_series=pd.Series(pd.date_range('2024-08-01',periods=3,freq='D'))#将时间序列本地化到UTC时区用于存储store_series=naive_series.dt.tz_localize('UTC')#打印存储的时间序列print("本地化到UTC时区以存储的时间序列:")print(store_series)#读取数据后转换到本地时区(Asia/Shanghai)local_series=store_series.dt.tz_convert('Asia/Shanghai')#打印转换后的时间序列print("转换到本地时区(Asia/Shanghai)后的时间序列:")print(local_series)287-6-3、结果输出#287、pandas.Series.dt.tz_localize方法#287-1、时区本地化#原始时间序列:#02024-08-01#12024-08-02#22024-08-03#dtype:datetime64[ns]#本地化到UTC时区后的时间序列:#02024-08-0100:00:00+00:00#12024-08-0200:00:00+00:00#22024-08-0300:00:00+00:00#dtype:datetime64[ns,UTC]#287-2、数据一致性#不同来源的时间序列:#Series1(UTC):#02024-08-0100:00:00+00:00#12024-08-0200:00:00+00:00#22024-08-0300:00:00+00:00#dtype:datetime64[ns,UTC]#Series2(Asia/Kolkata):#02024-08-0100:00:00+05:30#12024-08-0200:00:00+05:30#22024-08-0300:00:00+05:30#dtype:datetime64[ns,Asia/Kolkata]#转换到UTC时区后的时间序列:#02024-07-3118:30:00+00:00#12024-08-0118:30:00+00:00#22024-08-0218:30:00+00:00#dtype:datetime64[ns,UTC]#287-3、夏令时处理#包含夏令时变化的原始时间序列:#02024-03-1301:00:00#12024-03-1302:00:00#22024-03-1303:00:00#dtype:datetime64[ns]#处理夏令时模糊时间后的时间序列(shift_forward):#02024-03-1301:00:00-04:00#12024-03-1302:00:00-04:00#22024-03-1303:00:00-04:00#dtype:datetime64[ns,US/Eastern]#处理夏令时不存在时间后的时间序列(shift_forward):#02024-03-1301:00:00-04:00#12024-03-1302:00:00-04:00#22024-03-1303:00:00-04:00#dtype:datetime64[ns,US/Eastern]#287-4、数据转换和展示#UTC时区的原始时间序列:#02024-08-0100:00:00+00:00#12024-08-0200:00:00+00:00#22024-08-0300:00:00+00:00#dtype:datetime64[ns,UTC]#转换到用户所在时区(America/New_York)后的时间序列:#02024-07-3120:00:00-04:00#12024-08-0120:00:00-04:00#22024-08-0220:00:00-04:00#dtype:datetime64[ns,America/New_York]#287-5、数据存储和传输#本地化到UTC时区以存储的时间序列:#02024-08-0100:00:00+00:00#12024-08-0200:00:00+00:00#22024-08-0300:00:00+00:00#dtype:datetime64[ns,UTC]#转换到本地时区(Asia/Shanghai)后的时间序列:#02024-08-0108:00:00+08:00#12024-08-0208:00:00+08:00#22024-08-0308:00:00+08:00#dtype:datetime64[ns,Asia/Shanghai]288、pandas.Series.dt.tz_convert方法288-1、语法#288、pandas.Series.dt.tz_convert方法pandas.Series.dt.tz_convert(*args,**kwargs)Converttz-awareDatetimeArray/Indexfromonetimezonetoanother.Parameters:tzstr,pytz.timezone,dateutil.tz.tzfile,datetime.tzinfoorNoneTimezonefortime.CorrespondingtimestampswouldbeconvertedtothistimezoneoftheDatetimeArray/Index.AtzofNonewillconverttoUTCandremovethetimezoneinformation.Returns:ArrayorIndexRaises:TypeErrorIfDatetimeArray/Indexistz-naive.288-2、参数288-2-1、tz(必须):指定目标时区,可以是字符串(例如'US/Eastern','Europe/London'),也可以是pytz或者dateutil.tz模块中的时区对象。288-2-2、axis(可选,默认值为0):在Series对象上无效,仅用于DataFrame对象。288-2-3、level(可选,默认值为None):如果索引中有多级索引,则可以指定要转换时区的级别,此参数在Series中通常不使用。288-2-4、copy(可选,默认值为True):是否复制底层数据,如果设置为False,则会就地修改现有数据,而不是创建数据的副本。288-3、功能        用于将datetime数据从一种时区转换到另一种时区的方法。288-4、返回值        返回值是一个新的pandas.Series对象,包含转换到目标时区的时间戳。288-5、说明    使用场景:288-5-1、数据标准化和统一:在处理来自不同时区的数据时,使用该方法可以将所有时间戳转换到同一时区,方便后续的数据分析和比较。288-5-2、时间序列分析:在进行时间序列分析时,确保所有时间戳在同一时区可以避免因时区差异引起的误差,尤其是在计算统计量或绘制图表时。288-5-3、日志文件处理:在分析服务器日志文件时,不同服务器可能位于不同的时区,通过该方法将时间戳统一转换到同一时区,可以更容易地进行统一分析和排查问题。288-5-4、金融数据分析:金融市场的数据常常涉及多个时区,例如纽约(EST)、伦敦(GMT)和东京(JST),使用该方法可以将数据转换到交易时区,从而准确分析交易行为。288-5-5、多时区日程安排:在处理跨时区的会议和日程安排时,可以使用该方法将所有时间戳转换到参与者的本地时区,确保时间安排准确无误。288-6、用法288-6-1、数据准备无288-6-2、代码示例#288、pandas.Series.dt.tz_convert方法#288-1、数据标准化和统一importpandasaspd#创建包含不同时区的时间序列数据data={'datetime':['2024-01-0109:30:00','2024-01-0113:00:00','2024-01-0118:00:00'],'price':[100,102,105]}df=pd.DataFrame(data)df['datetime']=pd.to_datetime(df['datetime'])#假设这些时间戳来自不同的时区df['datetime']=df['datetime'].dt.tz_localize('US/Eastern')#将时间戳转换为UTCdf['datetime_utc']=df['datetime'].dt.tz_convert('UTC')print(df,end='\n\n')#288-2、时间序列分析importpandasaspd#创建时间序列数据data={'datetime':['2024-01-0109:30:00','2024-01-0110:00:00','2024-01-0115:00:00'],'price':[100,102,105]}df=pd.DataFrame(data)df['datetime']=pd.to_datetime(df['datetime'])#假设这些时间戳是纽约时间(EasternTime)df['datetime']=df['datetime'].dt.tz_localize('US/Eastern')#将时间戳转换为伦敦时间(GMT)df['datetime_gmt']=df['datetime'].dt.tz_convert('Europe/London')print(df,end='\n\n')#288-3、日志文件处理importpandasaspd#创建日志数据data={'timestamp':['2024-01-0101:00:00','2024-01-0104:00:00','2024-01-0107:00:00'],'event':['start','process','end']}df=pd.DataFrame(data)df['timestamp']=pd.to_datetime(df['timestamp'])#假设这些时间戳是UTCdf['timestamp']=df['timestamp'].dt.tz_localize('UTC')#将时间戳转换为服务器本地时间(假设为美国太平洋时间)df['timestamp_pacific']=df['timestamp'].dt.tz_convert('US/Pacific')print(df,end='\n\n')#288-4、金融数据分析importpandasaspd#创建金融市场数据data={'trade_time':['2024-01-0109:30:00','2024-01-0110:00:00','2024-01-0115:00:00'],'price':[100,102,105]}df=pd.DataFrame(data)df['trade_time']=pd.to_datetime(df['trade_time'])#假设这些时间戳是东京时间(JST)df['trade_time']=df['trade_time'].dt.tz_localize('Asia/Tokyo')#将时间戳转换为纽约时间(EasternTime)df['trade_time_eastern']=df['trade_time'].dt.tz_convert('US/Eastern')print(df,end='\n\n')#288-5、多时区日程安排importpandasaspd#创建会议安排数据data={'meeting_time':['2024-01-0110:00:00','2024-01-0114:00:00','2024-01-0120:00:00'],'agenda':['ProjectUpdate','TeamMeeting','ClientCall']}df=pd.DataFrame(data)df['meeting_time']=pd.to_datetime(df['meeting_time'])#假设这些时间戳是伦敦时间(GMT)df['meeting_time']=df['meeting_time'].dt.tz_localize('Europe/London')#将时间戳转换为参与者的本地时区(假设为印度标准时间IST)df['meeting_time_ist']=df['meeting_time'].dt.tz_convert('Asia/Kolkata')print(df,end='\n\n')#288-6、股票价格时间序列可视化importpandasaspdimportmatplotlib.pyplotasplt#创建包含不同时区的时间序列数据data={'datetime':['2024-01-0109:30:00','2024-01-0113:00:00','2024-01-0118:00:00'],'price':[100,102,105]}df=pd.DataFrame(data)df['datetime']=pd.to_datetime(df['datetime'])#假设这些时间戳来自不同的时区df['datetime']=df['datetime'].dt.tz_localize('US/Eastern')#将时间戳转换为UTCdf['datetime_utc']=df['datetime'].dt.tz_convert('UTC')#绘制时间序列图plt.figure(figsize=(10,6))plt.plot(df['datetime_utc'],df['price'],marker='o',linestyle='-',color='b')plt.title('StockPricesOverTime(UTC)')plt.xlabel('Time(UTC)')plt.ylabel('Price')plt.grid(True)plt.xticks(rotation=45)plt.tight_layout()plt.show()288-6-3、结果输出#288、pandas.Series.dt.tz_convert方法#288-1、数据标准化和统一#datetimepricedatetime_utc#02024-01-0109:30:00-05:001002024-01-0114:30:00+00:00#12024-01-0113:00:00-05:001022024-01-0118:00:00+00:00#22024-01-0118:00:00-05:001052024-01-0123:00:00+00:00#288-2、时间序列分析#datetimepricedatetime_gmt#02024-01-0109:30:00-05:001002024-01-0114:30:00+00:00#12024-01-0110:00:00-05:001022024-01-0115:00:00+00:00#22024-01-0115:00:00-05:001052024-01-0120:00:00+00:00#288-3、日志文件处理#timestampeventtimestamp_pacific#02024-01-0101:00:00+00:00start2023-12-3117:00:00-08:00#12024-01-0104:00:00+00:00process2023-12-3120:00:00-08:00#22024-01-0107:00:00+00:00end2023-12-3123:00:00-08:00#288-4、金融数据分析#trade_timepricetrade_time_eastern#02024-01-0109:30:00+09:001002023-12-3119:30:00-05:00#12024-01-0110:00:00+09:001022023-12-3120:00:00-05:00#22024-01-0115:00:00+09:001052024-01-0101:00:00-05:00#288-5、多时区日程安排#meeting_timeagendameeting_time_ist#02024-01-0110:00:00+00:00ProjectUpdate2024-01-0115:30:00+05:30#12024-01-0114:00:00+00:00TeamMeeting2024-01-0119:30:00+05:30#22024-01-0120:00:00+00:00ClientCall2024-01-0201:30:00+05:30#288-6、股票价格时间序列可视化#见图3图3: 289、pandas.Series.dt.normalize方法289-1、语法#289、pandas.Series.dt.normalize方法pandas.Series.dt.normalize(*args,**kwargs)Converttimestomidnight.Thetimecomponentofthedate-timeisconvertedtomidnighti.e.00:00:00.Thisisusefulincases,whenthetimedoesnotmatter.Lengthisunaltered.Thetimezonesareunaffected.ThismethodisavailableonSerieswithdatetimevaluesunderthe.dtaccessor,anddirectlyonDatetimeArray/Index.ReturnsatetimeArray,DatetimeIndexorSeriesThesametypeastheoriginaldata.Serieswillhavethesamenameandindex.DatetimeIndexwillhavethesamename.289-2、参数289-2-1、*args(可选):其他位置参数,为后续扩展功能做预留。289-2-2、**kwargs(可选):其他关键字参数,为后续扩展功能做预留。289-3、功能        用于将带有时间信息的时间戳序列转换为只有日期的时间戳,即将所有时间部分设为午夜(00:00:00),但保留时区信息(如果有的话)。289-4、返回值        返回一个新的pandas.Series对象,其中每个时间戳的时间部分被归零,只保留日期部分。289-5、说明    使用场景:289-5-1、数据聚合:当需要对数据按天进行聚合时,该方法可以将时间部分归零,使得不同时间的记录可以被归类到同一天进行统计。289-5-2、时间序列对齐:在对齐两个不同时间戳的时间序列时,如果只关心日期部分,可以使用该方法将它们对齐到同一天。289-5-3、数据筛选:当需要筛选出某一天的所有记录时,可以先将时间部分归零,然后根据日期进行筛选。289-5-4、可视化:在进行时间序列数据的可视化时,有时只需要按天显示数据,可以使用该方法将时间部分去掉。289-5-5、数据清洗:在数据清洗过程中,可能需要统一数据的时间部分,例如去除错误或不一致的时间信息,只保留日期部分。289-6、用法289-6-1、数据准备无289-6-2、代码示例#289、pandas.Series.dt.normalize方法#289-1、数据聚合importpandasaspd#示例数据data={'timestamp':['2024-01-0109:30:00','2024-01-0115:45:00','2024-01-0210:00:00'],'value':[10,20,30]}df=pd.DataFrame(data)df['timestamp']=pd.to_datetime(df['timestamp'])#将时间归零df['date']=df['timestamp'].dt.normalize()#按日期聚合daily_sum=df.groupby('date')['value'].sum()print(daily_sum,end='\n\n')#289-2、时间序列对齐importpandasaspd#创建两个时间序列series1=pd.Series([1,2,3],index=pd.date_range('2024-01-0109:00',periods=3,freq='h'))series2=pd.Series([4,5,6],index=pd.date_range('2024-01-0110:00',periods=3,freq='h'))#将时间归零series1.index=series1.index.normalize()series2.index=series2.index.normalize()#对齐操作aligned_series=series1+series2print(aligned_series,end='\n\n')#289-3、数据筛选importpandasaspd#示例数据data={'timestamp':['2024-01-0109:30:00','2024-01-0115:45:00','2024-01-0210:00:00'],'value':[10,20,30]}df=pd.DataFrame(data)df['timestamp']=pd.to_datetime(df['timestamp'])#将时间归零df['date']=df['timestamp'].dt.normalize()#筛选特定日期的记录specific_date_records=df[df['date']=='2024-01-01']print(specific_date_records,end='\n\n')#289-4、可视化importpandasaspdimportmatplotlib.pyplotasplt#示例数据data={'timestamp':pd.date_range('2024-01-01',periods=100,freq='h'),'value':range(100)}df=pd.DataFrame(data)df['timestamp']=pd.to_datetime(df['timestamp'])#将时间归零df['date']=df['timestamp'].dt.normalize()#按日期聚合daily_data=df.groupby('date')['value'].mean()#可视化daily_data.plot(kind='bar',color='purple')plt.xticks(rotation=15)plt.show()#289-5、数据清洗importpandasaspd#示例数据data={'timestamp':['2024-01-0109:30:00','2024-01-0115:45:00','2024-01-0210:00:00'],'value':[10,20,30]}df=pd.DataFrame(data)df['timestamp']=pd.to_datetime(df['timestamp'])#将时间归零,清洗数据df['timestamp']=df['timestamp'].dt.normalize()print(df)289-6-3、结果输出#289、pandas.Series.dt.normalize方法#289-1、数据聚合#date#2024-01-0130#2024-01-0230#Name:value,dtype:int64#289-2、时间序列对齐#2024-01-015#2024-01-017#2024-01-019#dtype:int64#289-3、数据筛选#timestampvaluedate#02024-01-0109:30:00102024-01-01#12024-01-0115:45:00202024-01-01#289-4、可视化#见图4#289-5、数据清洗#timestampvalue#02024-01-0110#12024-01-0120#22024-01-0230图4: 290、pandas.Series.dt.strftime函数290-1、语法#290、pandas.Series.dt.strftime函数pandas.Series.dt.strftime(*args,**kwargs)ConverttoIndexusingspecifieddate_format.ReturnanIndexofformattedstringsspecifiedbydate_format,whichsupportsthesamestringformatasthepythonstandardlibrary.Detailsofthestringformatcanbefoundinpythonstringformatdoc.FormatssupportedbytheCstrftimeAPIbutnotbythepythonstringformatdoc(suchas“%R”,“%r”)arenotofficiallysupportedandshouldbepreferablyreplacedwiththeirsupportedequivalents(suchas“%H:%M”,“%I:%M:%S%p”).NotethatPeriodIndexsupportadditionaldirectives,detailedinPeriod.strftime.Parameters:date_formatstrDateformatstring(e.g.“%Y-%m-%d”).Returns:ndarray[object]NumPyndarrayofformattedstrings.290-2、参数        format(必须):指定datetime对象应表示为字符串的格式,格式代码类似于Python内置的datetime.strftime函数,格式代码详情如下:290-2-1、年份相关格式%Y: 带世纪的年份,十进制数(例如,2024)%y: 不带世纪的年份,十进制数(例如,24)290-2-2、月份相关格式%m:月份,零填充的十进制数(例如,08)%B:完整的月份名称(例如,August)%b: 缩写的月份名称(例如,Aug)%h: 与%b相同(例如,Aug)290-2-3、日期相关格式%d: 一个月中的第几天,零填充的十进制数(例如,07)%e: 一个月中的第几天,不填充零(例如,7)290-2-4、星期相关格式%A:完整的星期名称(例如,Wednesday)%a:缩写的星期名称(例如,Wed)%w:星期中的第几天,数字表示,星期天为0(例如,3)%u: 星期中的第几天,数字表示,星期一为1(例如,3)290-2-5、年中的日期格式%j: 一年中的第几天,零填充的十进制数(例如,219)290-2-6、时间相关格式%H:小时(24小时制),零填充的十进制数(例如,14)%I:小时(12小时制),零填充的十进制数(例如,02)%p:AM或PM指示符%M:分钟,零填充的十进制数(例如,30)%S:秒,零填充的十进制数(例如,59)%f:微秒,零填充的十进制数(例如,000000)290-2-7、时区和时间差格式%z:UTC偏移的时差(例如,+0000)%Z: 时区名称(例如,UTC)290-2-8、日期与时间组合格式%c:日期和时间的完整字符串表示(例如,WedAug0714:30:592024)%x:日期的字符串表示(例如,08/07/24)%X:时间的字符串表示(例如,14:30:59)290-2-9、其他格式%%:字符"%"本身290-3、功能        用于将pandas系列中的datetime对象转换为格式化的字符串,该函数在需要以特定格式表示日期和时间信息用于报告或展示时特别有用。290-4、返回值        返回一个新的pandas系列,其中包含根据指定格式表示的格式化日期和时间值的字符串。290-5、说明    使用场景:290-5-1、日志记录:在记录日志时,需要精确记录事件发生的时间,通过strftime可以将时间戳格式化为标准化的日志记录格式。290-5-2、数据导出:在导出数据时,通常需要将日期和时间格式化为可读性强且标准化的形式,以便在Excel或其他工具中查看。290-5-3、Web应用展示:在Web应用中,需要将后台的日期时间数据转换为用户友好的格式进行展示。290-5-4、文件命名:在创建文件时,可以使用当前时间作为文件名的一部分,以避免命名冲突。290-5-5、用户输入解析:在处理用户输入的日期时间时,需要将字符串解析为日期对象进行计算或比较,同时也需要将结果格式化为用户可读的形式。290-5-6、自动化报告:在生成自动化报告时,通常需要在报告中包含生成时间,以便追踪报告的生成日期。290-6、用法290-6-1、数据准备无290-6-2、代码示例#290、pandas.Series.dt.strftime函数#290-1、日志记录importloggingfromdatetimeimportdatetimelogging.basicConfig(level=logging.INFO)now=datetime.now()formatted_time=now.strftime('%Y-%m-%d%H:%M:%S')logging.info(f'Eventoccurredat{formatted_time}')#290-2、数据导出importpandasaspddata={'timestamp':pd.to_datetime(['2024-08-0714:30:59','2024-12-2509:15:00'])}df=pd.DataFrame(data)df['formatted_date']=df['timestamp'].dt.strftime('%Y-%m-%d%H:%M:%S')df.to_csv('exported_data.csv',index=False)#290-3、Web应用展示fromflaskimportFlask,render_template_stringfromdatetimeimportdatetimeapp=Flask(__name__)@app.route('/')defindex():now=datetime.now()formatted_time=now.strftime('%Y-%m-%d%H:%M:%S')returnrender_template_string(' Currenttime:{{time}}',time=formatted_time)if__name__=='__main__':app.run()#290-4、文件命名fromdatetimeimportdatetimenow=datetime.now()formatted_time=now.strftime('%Y%m%d_%H%M%S')filename=f'backup_{formatted_time}.zip'print(filename)#290-5、用户输入解析fromdatetimeimportdatetimeuser_input='2024-08-0714:30:59'parsed_date=datetime.strptime(user_input,'%Y-%m-%d%H:%M:%S')formatted_date=parsed_date.strftime('%B%d,%Yat%I:%M%p')print(formatted_date)#290-6、自动化报告fromdatetimeimportdatetimenow=datetime.now()formatted_time=now.strftime('%Y-%m-%d%H:%M:%S')report_content=f'Reportgeneratedon{formatted_time}\n...'withopen('report.txt','w')asfile:file.write(report_content)290-6-3、结果输出#290、pandas.Series.dt.strftime函数#输出结果类似于:#INFO:root:Eventoccurredat2024-08-0721:10:26#INFO:numexpr.utils:NumExprdefaultingto4threads.#*ServingFlaskapp'test1'#*Debugmodeff#INFO:werkzeug:WARNING:Thisisadevelopmentserver.Donotuseitinaproductiondeployment.UseaproductionWSGIserverinstead.#*Runningonhttp://127.0.0.1:5000#INFO:werkzeugressCTRL+Ctoquit#backup_20240807_211032.zip#August07,2024at02:30PM二、推荐阅读1、Python筑基之旅2、Python函数之旅3、Python算法之旅4、Python魔法之旅5、博客个人主页
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-8 12:14 , Processed in 1.486221 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表