Python-重新格式化日期时间索引
我有两个数据帧,它们在“Date”和“name”上都是多索引的,我想做一个SQL风格的Python-重新格式化日期时间索引,python,numpy,pandas,Python,Numpy,Pandas,我有两个数据帧,它们在“Date”和“name”上都是多索引的,我想做一个SQL风格的JOIN来组合它们。我试过了 pd.merge(df1.reset_index(), df2.reset_index(), on=['name', 'Date'], how='inner') 这将导致一个空的数据帧 如果我检查数据帧,我可以看到其中一个的索引表示为'2015-01-01',另一个表示为'2015-01-01 00:00',这解释了我加入的问题 有没有一种方法可以将索引“重铸”为pandas中的
JOIN
来组合它们。我试过了
pd.merge(df1.reset_index(), df2.reset_index(), on=['name', 'Date'], how='inner')
这将导致一个空的数据帧
如果我检查数据帧,我可以看到其中一个的索引表示为'2015-01-01'
,另一个表示为'2015-01-01 00:00'
,这解释了我加入的问题
有没有一种方法可以将索引“重铸”为pandas中的特定格式
我已经包括了这些表,以查看我正在处理哪些数据
df1=
+-------------+------+------+------+
| Date | name | col1 | col2 |
+-------------+------+------+------+
| 2015-01-01 | mary | 12 | 123 |
| 2015-01-02 | mary | 23 | 33 |
| 2015-01-03 | mary | 34 | 45 |
| 2015-01-01 | john | 65 | 76 |
| 2015-01-02 | john | 67 | 78 |
| 2015-01-03 | john | 25 | 86 |
+-------------+------+------+------+
df2=
+------------+------+-------+-------+
| Date | name | col3 | col4 |
+------------+------+-------+-------+
| 2015-01-01 | mary | 80809 | 09885 |
| 2015-01-02 | mary | 53879 | 58972 |
| 2015-01-03 | mary | 23887 | 3908 |
| 2015-01-01 | john | 9238 | 2348 |
| 2015-01-02 | john | 234 | 234 |
| 2015-01-03 | john | 5325 | 6436 |
+------------+------+-------+-------+
预期结果:
+-------------+------+------+-------+-------+-------+
| Date | name | col1 | col2 | col3 | col4 |
+-------------+------+------+-------+-------+-------+
| 2015-01-01 | mary | 12 | 123 | 80809 | 09885 |
| 2015-01-02 | mary | 23 | 33 | 53879 | 58972 |
| 2015-01-03 | mary | 34 | 45 | 23887 | 3908 |
| 2015-01-01 | john | 65 | 76 | 9238 | 2348 |
| 2015-01-02 | john | 67 | 78 | 234 | 234 |
| 2015-01-03 | john | 25 | 86 | 5325 | 6436 |
+-------------+------+------+-------+-------+-------+
您无法加入的原因是您的标识上有不同的数据类型。如果指示符号有不同的数据类型,熊猫会默默地失败 您可以轻松地将标记从时间的字符串表示形式更改为正确的日期时间,如下所示:
df = pd.DataFrame({"data":range(1,30)}, index=['2015-04-{}'.format(d) for d in range(1,30)])
df.index.dtype
dtype('O')
df.index = df.index.to_series().apply(pd.to_datetime)
df.index.dtype
dtype('<M8[ns]')
假设您有一个df2,我的示例省略了…很抱歉,您的“日期”数据类型是datetimes吗?它是多索引的,但是当我打印一个连接的表时,它显示一些日期为
'2015-06-09 00:00:00'
和u'2013-04-17'
,所以我认为有些是字符串,有些是日期时间。我可以转换它们吗?我尝试了df.index=df.index.date
但我很难访问多索引的单个组件。重置索引后,使用df['date']=pd.to_datetime(df['date'])将数据类型转换为
然后应该可以合并
pd.merge(left=df, left_index=True,
right=df2, right_index=True)