如何更改列中的日期?

时间:2017-11-22 14:51:43

标签: python pandas datetime timestamp

我遇到了Pandas,Python的问题。我有几行具有不同的日期,其中日期是字符串

"2016-02-28"   ABC123
"2016-02-29"   CDE345
"2016-03-30"   FGH567
"2016-03-31"   XYZ235
...

在这里,我们看到feb有两个不同的日子,28和29.我只对这个月感兴趣。因此,我希望这些行具有相同的日期,如下所示:

"2016-02-29"   ABC123
"2016-02-29"   CDE345
"2016-03-31"   FGH567
"2016-03-31"   XYZ235
...

他们得到的日子并不重要,只要它是同一天,但最后一天更可取。我不能截断,只能保持" 2016-02"因为我后来需要这一天。如果它变得更容易,我可以将其转换为时间戳。

df ["DATE"] = pandas.to_datetime (df ["DATE"])

(另一个问题,为什么这行将DATE列转换为Timestamp而不是datetime?它说要转换为datetime,而是变成Timestamp?)

我试图重新取样,但无济于事。我不想像以前那样通过剪切和粘贴字符串来手动执行此操作。应该有一个更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:2)

使用MonthEnd偏移量:

df["DATE"] = pd.to_datetime (df["DATE"]) + pd.offsets.MonthEnd(0)
print (df)
        DATE     COL
0 2016-02-29  ABC123
1 2016-02-29  CDE345
2 2016-03-31  FGH567
3 2016-03-31  XYZ235

如果真正重要的DataFrame和性能很重要:

df['DATE'] = pd.to_datetime(df["DATE"]).values.astype('datetime64[M]') + \
                            np.array([1], dtype='timedelta64[M]') - \
                            np.array([1], dtype='timedelta64[D]')
print (df)
        DATE     COL
0 2016-02-29  ABC123
1 2016-02-29  CDE345
2 2016-03-31  FGH567
3 2016-03-31  XYZ235
  

(另一个问题,为什么这一行将DATE列转换为   时间戳而不是日期时间?它说要转换为datetime,但是   相反,它变成了时间戳?)

如果您看到文档here,则说明:

  

TimeStamp是与python的Datetime等效的熊猫   在大多数情况下可以与它互换。它是用于的类型   组成DatetimeIndex的条目,以及其他面向时间序列的条目   大熊猫中的数据结构。

答案 1 :(得分:0)

或者我们使用to_period

df.index=df.index.to_period('M').to_timestamp('M')
df
Out[16]: 
                 A
2016-02-29  ABC123
2016-02-29  CDE345
2016-03-31  FGH567
2016-03-31  XYZ235