Pandas:dtype对象

时间:2018-04-19 17:54:46

标签: python pandas datetime time-series

我正在制作一个如下所示的时间序列数据集:

         DateTime         SomeVariable 
0   01/01 01:00:00          0.24244
1   01/01 02:00:00          0.84141
2   01/01 03:00:00          0.14144
3   01/01 04:00:00          0.74443
4   01/01 05:00:00          0.99999

日期没有年份。最初,DateTime的dtype是对象,我试图将其更改为pandas datetime格式。由于我的数据中的日期没有年份,因此使用:

df['DateTime'] = pd.to_datetime(df.DateTime)

我收到错误OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1-01-01 01:00:00

我理解为什么我会收到错误(因为它不是根据熊猫可接受的格式),但我想知道的是我如何将dtype从object更改为pandas datetime格式而没有年份我的约会。我很欣赏这些提示。

编辑1:

因为,我知道在没有数据年份的情况下我无法做到这一点。所以这就是我试图改变dtype的方式:

df = pd.read_csv(some file location)
df['DateTime'] = pd.to_datetime('2018/'+df['DateTime'], format='%y%d/%m %H:%M:%S')
df.head()

这样做,我得到了:

ValueError: time data '2018/ 01/01 01:00:00' doesn't match format specified.

编辑2:

将格式更改为'%Y/%m/%d %H:%M:%S'。 我的数据是每小时数据,因此一直持续到24小时。我只提供了演示数据直到5h。 我正在为DateTime添加年份。为了消除这种情况,我就这样做了:

df['DateTime'] = pd.to_datetime('2018/'+df['DateTime'][1:], format='%Y/%m/%d %H:%M:%S')

我收到以下错误:

ValueError: time data '2018/ 01/01  02:00:00' doesn't match format specified

使用相同的代码将格式更改为'%y/%m/%d %H:%M:%S'时,这是我得到的错误:

ValueError: time data '2018/ 01/01  02:00:00' does not match format '%y/%m/%d %H:%M:%S' (match)

问题是因为一年之后的差距,但我无法摆脱它。

编辑3:

我可以在添加年份之后摆脱空间,但是我仍然无法更改dtype。

df['DateTime'] = pd.to_datetime('2018/'+df['DateTime'].str.strip(), format='%Y/%m/%d %H:%M:%S')

ValueError: time data '2018/01/01  01:00:00' doesn't match format specified

我注意到错误中日期和时间之间有2个空格,但是在格式中添加2个空格并没有帮助。

编辑4(解决方案)

删除了所有多个空格。格式仍然不匹配。问题是因为时间格式。我的数据的小时数是1-24,熊猫的支持是0-23。只需将时间从24:00:00改为00:00:00,现在就可以完美运行。

2 个答案:

答案 0 :(得分:0)

# Remove spaces. Have in mind this will remove all spaces.
df['DateTime'] = df['DateTime'].str.replace(" ", "")

# I'm assuming year does not matter and that 01/01 is in the format day/month.
df['DateTime'] = pd.to_datetime(df['DateTime'], format='%d/%m%H:%M:%S')

答案 1 :(得分:0)

这是不可能的。 datetime对象必须有一年。

可以做的事情是确保所有年份都符合您的数据。

例如,要在将年份设置为2018时转换为datetime

df = pd.DataFrame({'DateTime': ['01/01 01:00:00', '01/01 02:00:00', '01/01 03:00:00',
                                '01/01 04:00:00', '01/01 05:00:00']})

df['DateTime'] = pd.to_datetime('2018/'+df['DateTime'], format='%Y/%m/%d %H:%M:%S')

print(df)

             DateTime
0 2018-01-01 01:00:00
1 2018-01-01 02:00:00
2 2018-01-01 03:00:00
3 2018-01-01 04:00:00
4 2018-01-01 05:00:00