将python字符串索引转换为datetime索引
我正在导入一些数据,其中一列表示日期,另一列表示小时。我想把它们合并成一个DateTime列 我用过将python字符串索引转换为datetime索引,python,pandas,datetime,Python,Pandas,Datetime,我正在导入一些数据,其中一列表示日期,另一列表示小时。我想把它们合并成一个DateTime列 我用过 df2 = pd.read_csv(csv_file_path, parse_dates=[['Date', 'Hour']], infer_datetime_format=True) 它回来了 Date_Hour Unnamed: 0 Data 0 2018-01-01 0 3
df2 = pd.read_csv(csv_file_path,
parse_dates=[['Date', 'Hour']],
infer_datetime_format=True)
它回来了
Date_Hour Unnamed: 0 Data
0 2018-01-01 0 3 51.29
1 2018-01-01 1 4 43.59
2 2018-01-01 2 5 93.60
3 2018-01-01 3 6 54.78
4 2018-01-01 4 7 14.35
但是列Date_Hour不是DateTime格式,当我尝试转换它时,我得到一个错误
df2.set_index('Date_Hour', inplace=True)
pd.to_datetime(df2.index)
给予
我也尝试过使用
pd.to_datetime(prices.index, format='%y-%m-%d %H')
我导入的数据如下所示
,Date,Hour,Data
3,2018-01-01,0,51.29
4,2018-01-01,1,43.59
5,2018-01-01,2,93.60
6,2018-01-01,3,54.78
7,2018-01-01,4,14.35
8,2018-01-01,5,18.60
我希望输出是
Data
Date_Hour
2018-01-01 00:00 51.29
2018-01-01 01:00 43.59
2018-01-01 02:00 93.60
2018-01-01 03:00 54.78
2018-01-01 04:00 14.35
在这种特定情况下,小时中缺少的前导
0
是有问题的。您可以避免这种导入,而无需解析到datetime
,然后在解析到datetime
之前使用zfill
:
df2 = pd.read_csv(csv_file_path)
df2.index = pd.to_datetime(df2.Date + df2.Hour.astype(str).str.zfill(2), format='%Y-%m-%d%H')
要在解析后删除日期
和小时
列,请执行以下操作:
df2.drop(['Date' ,'Hour'], axis=1, inplace=True)
简短说明:zfill
将在数字字符串中填充指定字符数的零
当然,您也可以为
pd.read\u csv
指定一个date\u解析器,但是在这种情况下,在阅读csv之后解析日期要清晰得多,而且更像python。编辑:一些答案大大改进了我的第一次破解。我将不讨论这个问题,因为它在另一个答案中被引用
让我们先将日期设置为datetime类型
df["Date"] = pd.to_datetime(df["Date"], unit="ms")
我们希望增加小时数,因此它们必须是Timedelta
df["Hour"] = df["Hour"].apply(lambda x: pd.Timedelta(hours=int(x)))
下面是一个简单的总数:
df["Date_hour"] = df["Date"] + df["Hour"]
设置datetime索引的方法与设置datetime数据类型的任何其他列的方法相同:
df = df.set_index("Date_hour")
很接近。只是一些变化
df
sr Date Hour Data
0 3 2018-01-01 0 51.29
1 4 2018-01-01 1 43.59
2 5 2018-01-01 2 93.60
3 6 2018-01-01 3 54.78
4 7 2018-01-01 4 14.35
5 8 2018-01-01 5 18.60
df["Date"] = pd.to_datetime(df["Date"], unit="ns")
df["Hour"] = pd.to_timedelta(df["Hour"])
df["Date_Hour"]=(df["Date"] + df["Hour"]).dt.strftime('%Y-%m-%d %H:%M')
df.set_index("Date_Hour")
sr Date Hour Data
Date_Hour
2018-01-01 00:00 3 2018-01-01 0 51.29
2018-01-01 01:00 4 2018-01-01 1 43.59
2018-01-01 02:00 5 2018-01-01 2 93.60
2018-01-01 03:00 6 2018-01-01 3 54.78
2018-01-01 04:00 7 2018-01-01 4 14.35
2018-01-01 05:00 8 2018-01-01 5 18.60
你想要的o/p是什么?我会更新这个问题,但要有一个日期时间格式的索引,Date\u Hour
的预期格式是什么?不,索引有不同的用途。@LukaVlaskalic我的回答解决了你的问题吗?我怀疑这比转换到Timedelta(我在回答中走的路线)要快是的,确实是这样。:)特别是使用apply对所有值进行循环将减慢解析速度。df[“Hour”]=df[“Hour”].apply(lambda x:pd.Timedelta(hours=int(x))
可以使用df[“Hour”]=pd.to_Timedelta(df[“Hour”],unit='h')简化
这仍然比直接解析到datetime要慢,需要3行代码而不是一行。:)是的,这仍然是一个很好的答案,可能对其他情况有所帮助,因此我投了赞成票。
df
sr Date Hour Data
0 3 2018-01-01 0 51.29
1 4 2018-01-01 1 43.59
2 5 2018-01-01 2 93.60
3 6 2018-01-01 3 54.78
4 7 2018-01-01 4 14.35
5 8 2018-01-01 5 18.60
df["Date"] = pd.to_datetime(df["Date"], unit="ns")
df["Hour"] = pd.to_timedelta(df["Hour"])
df["Date_Hour"]=(df["Date"] + df["Hour"]).dt.strftime('%Y-%m-%d %H:%M')
df.set_index("Date_Hour")
sr Date Hour Data
Date_Hour
2018-01-01 00:00 3 2018-01-01 0 51.29
2018-01-01 01:00 4 2018-01-01 1 43.59
2018-01-01 02:00 5 2018-01-01 2 93.60
2018-01-01 03:00 6 2018-01-01 3 54.78
2018-01-01 04:00 7 2018-01-01 4 14.35
2018-01-01 05:00 8 2018-01-01 5 18.60