Pandas преобразование объектов даты и времени в метки времени или целые числа при вставке в данные - PullRequest
0 голосов
/ 16 марта 2020

У меня есть фрейм данных, который мне нужно обновить дополнительными данными. Для этого я сначала инициализирую и соединяю пустой фрейм данных с правильным количеством строк. Однако с классами объектов происходят странные вещи, когда я перезаписываю пустые столбцы объектами datetime. Например:

import pandas as pd
import numpy as np
from datetime import datetime

# empty data frame
df1 = post_df = pd.DataFrame({
    'var':[np.nan]*int(10),
    'date':[np.nan]*int(10)
    })
# full data frame
df2 = post_df = pd.DataFrame({
    'var':[0,1,2,3,4,5,6,7,8,9],
    'date':['2020-01-01']*int(10)
    })

# make df2.date datetime
convert_date = [datetime.strptime(dt_str, '%Y-%m-%d') for dt_str in df2.date]
# NOTE 1: Notice that before subbing into pandas dataframe 
# the class is datetime.datetime 
print(type(convert_date[0]))
df2.loc[:,'date'] = convert_date
# NOTE 2: But after replacing the column the class is 
# pandas._libs.tslibs.timestamps.Timestamp
print(type(df2.date[0]))

# join dataframes together
df_join = pd.concat([df1, df2]).reset_index(drop=True)
# NOTE 3: Now the np.nan is converted to NaT (this is fine) and the data is 
# still pandas._libs.tslibs.timestamps.Timestamp
print(type(df_join.date[0]))
print(type(df_join.loc[len(df_join)-1,'date']))

# make data to sub into the data frame
data_sub = [datetime.strptime(dt_str, '%d/%m/%Y') for dt_str in ['01/01/2019']*10]
# NOTE 4: The data_sub class is datetime.datetime
print(type(data_sub[0]))

# Sub data into data frame
df_join.loc[0:9, 'date'] = data_sub
# NOTE 5: The data that has been subbed into the data frame is still datetime.datetime 
# (pandas._libs.tslibs.timestamps.Timestamp like before?) but the timestamps from before
# have been convereted into integers?
print(type(df_join.date[0]))
print(type(df_join.loc[len(df_join)-1,'date']))

# print the data frame
print(df_join)

Вывод сценария:

# NOTE 1:
<class 'datetime.datetime'>

# NOTE 2:
<class 'pandas._libs.tslibs.timestamps.Timestamp'>

# NOTE 3:
<class 'pandas._libs.tslibs.nattype.NaTType'>
<class 'pandas._libs.tslibs.timestamps.Timestamp'>

# NOTE 4:
<class 'datetime.datetime'>

# NOTE 5:
<class 'datetime.datetime'>
<class 'int'>

# Final data frame
    var                 date
0   NaN  2019-01-01 00:00:00
1   NaN  2019-01-01 00:00:00
2   NaN  2019-01-01 00:00:00
3   NaN  2019-01-01 00:00:00
4   NaN  2019-01-01 00:00:00
5   NaN  2019-01-01 00:00:00
6   NaN  2019-01-01 00:00:00
7   NaN  2019-01-01 00:00:00
8   NaN  2019-01-01 00:00:00
9   NaN  2019-01-01 00:00:00
10  0.0  1577836800000000000
11  1.0  1577836800000000000
12  2.0  1577836800000000000
13  3.0  1577836800000000000
14  4.0  1577836800000000000
15  5.0  1577836800000000000
16  6.0  1577836800000000000
17  7.0  1577836800000000000
18  8.0  1577836800000000000
19  9.0  1577836800000000000

Почему классы данных преобразуются в некоторых случаях, но не в других, и как я могу обеспечить выполнение кадра данных столбец даты остается datetime.datetime класс?

...