我正在分析时间序列问题,并且我有'YYYY-MM-DD HR-MN-SEC'格式的数据。
我想将数据转换为'MM-DD HR-MN-SEC'格式。简而言之,我想删除年份数据。转换后,我希望数据为 datetime 格式,而不是字符串格式。
我尝试拆分数据,但是它返回一个字符串。我希望在同一列中使用相同格式的数据。 这是我下面的代码:
#slicing 2016 data
df8=df1.loc['2016',['humidity','pressure','temp']]
#removing outliers
df8=df8[(np.abs(stats.zscore(df8)) < 3).all(axis=1)]
df8.head()
humidity pressure temp
datetime_utc
2016-01-01 00:00:00 100.0 1020.0 8.0
2016-01-01 03:00:00 94.0 1022.0 10.0
2016-01-01 06:00:00 51.0 1022.0 20.0
2016-01-01 09:00:00 32.0 1019.0 23.0
转换后,我希望数据框看起来像这样。期待获得帮助。
humidity pressure temp
datetime_utc
01-01 00:00:00 100.0 1020.0 8.0
01-01 03:00:00 94.0 1022.0 10.0
01-01 06:00:00 51.0 1022.0 20.0
01-01 09:00:00 32.0 1019.0 23.0
答案 0 :(得分:0)
如上所述,Datetime
必须有一年。当然可以将它们全部设置为0,然后将其忽略。
但是这个问题是关于按月,按小时等方式处理索引的问题。
某些策略将与PeriodIndex
或TimedeltaIndex
一起使用。或将数据容忍为字符串。然后是Grouper(freq=)
。
这是一个忙碌的盒子。祝您分析时间序列数据好运。
import pandas as pd
# period index strategy
df = pd.DataFrame({"y": [1,2,3,4,5]}, pd.to_datetime(["2000-03-31 00:00:00", "2000-05-31 00:00:00", "2000-08-31 00:00:00", "2000-11-30 00:00:00", "2001-01-31 00:00:00"]))
df.index = df.index.to_period("D")
print(df)
# timedelta strategy
df = pd.DataFrame({"y": [1,2,3,4,5]}, pd.to_datetime(["2000-03-31 00:00:00", "2000-05-31 00:00:00", "2000-08-31 00:00:00", "2000-11-30 00:00:00", "2001-01-31 00:00:00"]))
timedeltas = df.index.to_series().diff()
df['timedeltas'] = timedeltas
df['days'] = df['timedeltas'].apply(lambda x:x.days)
df['hours'] = df['timedeltas'].apply(lambda x:x.seconds/3600)
df.set_index(['days', 'hours'], inplace=True)
print(df)
# string strategy
df = pd.DataFrame({"y": [1,2,3,4,5]}, pd.to_datetime(["2000-03-31 00:00:00", "2000-05-31 00:00:00", "2000-08-31 00:00:00", "2000-11-30 00:00:00", "2001-01-31 00:00:00"]))
df['month'] = df.index.month
df['day'] = df.index.day
df.set_index(['month', 'day'], inplace=True)
print(df)
# time grouping
df = pd.DataFrame({"y": [1,2,3,4,5]}, pd.to_datetime(["2000-03-31 00:00:00", "2000-05-31 00:00:00", "2000-08-31 00:00:00", "2000-11-30 00:00:00", "2001-01-31 00:00:00"]))
data = df.groupby(pd.Grouper(freq='M')).count()
print (data)